我从NodeJS和Express 4开始,我有点困惑。我一直在阅读Express网站,但不知道什么时候使用路由处理程序或什么时候使用Express . router。

正如我所看到的,如果我想在用户点击/show时显示一个页面或其他东西,例如,我应该使用:

var express = require('express')    
var app = express()    
app.get("/show", someFunction)  

一开始,我认为这是旧的(快车3)。这是对的,还是这是快车4的方式?

如果这是特快4的做法,什么是特快。路由器用于?

我看到了几乎和上面相同的例子,但是使用了express。路由器:

var express = require('express');
var router = express.Router();
router.get("/show", someFunction)

那么,这两个例子有什么不同呢?

如果我只是想做一个简单的测试网站,我应该使用哪一个?


当前回答

假设您的应用程序有点复杂。因此,我们首先要做的是将应用程序划分为多个模块,这样一个模块中的更改就不会影响其他模块,您可以继续在各个模块上工作,但最终您需要将所有内容集成到一个模块中,因为您正在构建单个应用程序。这就像我们有一个主应用程序和几个子应用程序,它们的父应用程序是主应用程序。 当我们创建父应用程序时,我们使用

const express = require("express");
const parent = express();

对于父应用程序,我们需要引入子应用程序。但由于子应用程序并不是完全不同的应用程序(因为它们运行在相同的上下文中- java术语),express提供了通过express的Router函数来实现的方法,这就是我们在每个子模块文件中所做的,并调用这样的子模块aboutme。

const express = require("express");
export const router = express.Router();

通过导出,我们使这个模块可供其他人使用,由于我们已经模块化了,我们需要通过节点的require函数使模块文件可用于父应用程序,就像任何其他第三方模块一样,父文件看起来像这样:

const express = require("express");
const parent = express();
const child = require("./aboutme");

在我们让这个子模块对父应用程序可用之后,我们需要告诉父应用程序什么时候使用这个子应用程序。假设当一个用户点击了关于我的路径,我们需要关于我的子应用程序来处理请求,我们使用Express的use方法来做到这一点:

parent.use("/aboutme", child);

在一个镜头中,父文件看起来是这样的:

const express = require("express");
const parent = express();
const child = require("./aboutme");

parent.use("/aboutme", child);

最重要的是,父进程可以启动子进程不能启动的服务器。希望这能说明问题。要了解更多信息,你可以查看源代码,这需要一些时间,但它给了你很多信息。

其他回答

app.js

var express = require('express'),
    dogs    = require('./routes/dogs'),
    cats    = require('./routes/cats'),
    birds   = require('./routes/birds');

var app = express();

app.use('/dogs',  dogs);
app.use('/cats',  cats);
app.use('/birds', birds);

app.listen(3000);

dogs.js

var express = require('express');

var router = express.Router();

router.get('/', function(req, res) {
    res.send('GET handler for /dogs route.');
});

router.post('/', function(req, res) {
    res.send('POST handler for /dogs route.');
});

module.exports = router;

当var app = express()被调用时,返回一个app对象。把这个看作是主应用。

当var router = express.Router()被调用时,返回一个略有不同的小应用程序。迷你应用程序背后的想法是,应用程序中的每条路由都可能变得相当复杂,将所有代码移到一个单独的文件中会受益。每个文件的路由器都变成了一个小应用程序,它的结构与主应用程序非常相似。

在上面的例子中,/dogs路径的代码已经被移动到它自己的文件中,所以它不会把主应用程序弄得乱七八糟。/cats和/birds的代码在它们自己的文件中也会有类似的结构。通过将此代码分离为三个小应用程序,您可以单独处理每个小应用程序的逻辑,而不必担心它将如何影响其他两个小应用程序。

如果你有属于这三种路由的代码(中间件),你可以在app.use(…)调用之前把它放在主应用程序中。如果您有只属于其中一条路由的代码(中间件),那么您可以将它只放在该路由的文件中。

Express 4.0附带了新的路由器。正如网站上提到的:

表达。路由器类可以用来创建模块化可挂载路由 处理程序。一个Router实例是一个完整的中间件和路由 系统;因此,它通常被称为“迷你应用程序”。

https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4上有一篇很好的文章,介绍了两者的区别以及路由器可以做什么。

总结

使用路由器,你可以更容易地模块化你的代码。你可以使用路由器:

基本路线:家,大约 路由中间件,将请求记录到控制台 带参数的路由 用于验证特定参数的参数路由中间件 验证传递给特定路由的参数

注意:

在Express 4中被删除的app.router对象在Express 5中重新出现。在新版本中,它只是一个对基本Express路由器的引用,不像在Express 3中,应用程序必须显式地加载它。

app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Post a random book')
  })

在上面的例子中,我们可以在一个路由下添加不同的HTTP请求方法。

使用app.js来编写路由意味着当应用程序启动时加载app.js时,所有用户都可以访问这些路由。但是,将路由放在express.router()小应用程序中可以保护和限制它们的可访问性。

表达。路由器有很多选项:

启用区分大小写:/show route不与/show相同,默认情况下不启用此行为 严格路由模式:/show/路由到与/show不相同,此行为默认也被禁用 我们可以为特定的路由添加特定的中间件