get/post/... 和使用有什么区别

What is the difference between get/post/... and use

全部:

我是 Express 4 路由器的新手。

当我尝试一些 login/signup 示例时,我遇到了一个关于 .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/... 的总称吗?

我找到这个 post:Difference between app.use and app.get in express.js

但是还是觉得不太好理解....

谢谢

.use用于2种情况,中间件和"modular mountable route handlers".

在你的例子中

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

这意味着发送到 /hello 的任何请求都将以 "Welcome" 终止,并且不会调用附加到 /hello 的实际 .get

所以,总之,当你需要应用一些通用的中间件或者想用路由器做模块化架构时,就调用useuse 可以 "used" 作为请求处理程序,但你不应该这样做,因为它不是为此目的而设计的

除了 Jonathan Lonowski 在帖子 link 中所说的之外,不将 usegetpost 进行比较可能会有所帮助,但将其与all 因为 alluse 都可以工作,而不管使用的 HTTP 谓词如何,而对于 get 显然不是这样。如果将 "all" 替换为 "get",我要说的一切都适用,它只会将该处理程序缩小到特定的 HTTP 动词。

那么,alluse 有什么区别?

app.all 将处理指定 URL 路径的传入请求,而不管 HTTP 动词,就像 app.use 一样。但是,它将请求的 URL 与处理程序进行比较的方式不同。例如:

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

如果您向 /foo/123 路由 A 发出请求, 将成为 运行。

但是,如果您提出请求,/bar/123 路线 B ​​ 将不会 成为 运行。

这是因为 HTTP verbs express 比较 完整路径 ,但是 'use' 它只关心 [=93] 的 开头=]。因为 URL /foo/123/foo 开头,路由 A 会 运行,但是因为 /bar/123 不匹配 FULL URL,所以路由 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 则不需要。

一天结束时,如果您:

  1. 想要在给定路径下进入的所有请求(甚至每个请求)都使用指定的中间件,或者
  2. 想要挂载整个子router/application,或者
  3. 想要在您的应用程序中包含一个插件

...那么use大概就是你想要的。

如果你:

  1. 正在特定 URL 路径处理特定请求(即可能没有在 URL 中进行 * 匹配)
  2. 通常不会调用 next,而是实际处理请求

...那么 HTTP 动词方法(如 getpostall)可能就是您想要的。