get / post / ...和use之间有什么区别

时间:2015-05-21 17:05:34

标签: express middleware

所有

我是Express 4路由器的新手。

当我尝试一些登录/注册示例时,我遇到了一个关于.use和.get / .post函数的问题:

我看到它有时使用:

var express = require('express');
var router = express.Router();

router.get('/hello', function(req, res, next) {
  res.send("Welcome");
});

在主应用中,我们使用它:

app.use("/", router);

在其他时间,它使用:

var express = require('express');
var router = express.Router();

//here the router uses .use() function rather than .get/.post
router.use('/hello', function(req, res, next) {
  res.send("Welcome");
});

在主应用中,我们使用它:

app.use("/", router);

所以我想知道它们之间有什么区别, .use()只是所有get / post / put / ...的通用名称吗?

我发现这篇文章:Difference between app.use and app.get in express.js

但是仍然不容易理解这个....

由于

2 个答案:

答案 0 :(得分:5)

除了Jonathan Lonowski在发布的链接中所说的内容之外,将usegetpost进行比较可能会有所帮助,但要将其与all进行比较,因为无论使用哪个HTTP动词,alluse都可以正常工作,而get显然不是这样。如果您更换所有"所有"我要说的一切都适用。使用" get",它只是将该处理程序缩小到特定的HTTP动词。

那么,alluse之间的区别是什么?

无论HTTP动词如何,

app.all都将处理指定URL路径上的传入请求,就像app.use那样。但是,它如何将请求的URL与处理程序进行比较是不同的。例如:

var r = express.Router();
r.use('/foo', function (...) { ... }); // Route A
r.all('/bar', function (...) { ... }); // Route B

如果您向/foo/123路线提出请求运行。

但是,如果您提出请求,则/bar/123路线B 将不会

运行。

这是因为HTTP动词express比较完整路径,但是使用'使用'它只关心URL的开头。由于网址/foo/123/foo开头,因此路由A将会运行,但由于/bar/123与FULL网址不匹配,因此路由B不会。注意:您可以使.all以相同的方式行事:r.all('/bar/*', ...),但use更容易且更适合此。

所以,你倾向于用一个与另一个搭载的东西是不同的。例如:

var app = express();
var router1 = express.Router();
var router2 = express.Router();

router2.all('*', function (req, res) { ... }); // Must specify a path!

router1.use('/secondary-routes', router2); // Can't do this with all.

app.use(router1); // Look Ma, no path!

我已经使用all来处理请求,我已经使用use来安装整个路由器。另请注意,router.METHOD函数的使用需要将URL字符串作为第一个参数,而use则不需要。{/ p>

在一天结束时,如果你:

  1. 希望在给定路径(甚至每个请求)下进入的所有请求都使用指定的中间件,或
  2. 想要安装整个子路由器/应用程序,或
  3. 想在您的应用中加入插件
  4. ...然后use可能就是你想要的。

    如果你:

    1. 正在处理特定网址路径上的特定请求(即可能未在网址中执行*匹配)
    2. 一般不会打电话给next而实际上会处理请求
    3. ...然后HTTP动词方法(如getpostall)可能就是您想要的。

答案 1 :(得分:1)

.use用于2个案例,中间件和"模块化可安装路由处理程序"。

在你的例子中

router.use('/hello', function(req, res, next) {
  res.send("Welcome");
});

这意味着发送给/hello的所有请求都将以"欢迎"并且不会调用附加到.get的实际/hello

因此,简而言之,当您需要应用一些通用中间件或想要使用路由器进行模块化架构时,请调用useuse可以"使用"作为请求处理程序,但你不应该因为它不是为那个目的设计的