背景
有几个部分可以解释这一点。首先,关闭app.use() 期望将中间件函数传递给它。那将是一个具有如下签名的函数:
app.use(function(req, res, next) {
console.log(req.path); // log incoming request path
next(); // continue routing to other handlers
});
它接受其他参数组合,包括初始路径,您也可以传递多个中间件函数,它将它们链接在一起,但您的问题的基础是关于单个中间件函数,如上所示。该中间件函数获取三个参数req - 传入请求对象,res - 传出响应对象和next - 如果您想继续路由或报告错误则调用的函数。
其中一个中间件函数的工作是使用req 对象中的输入对该输入进行某种处理(取决于中间件函数的用途),然后执行以下三件事之一:
-
使用类似res.send() 的方式发送响应,在这种情况下,请求已被处理并已发送响应,并且不会进行进一步的路由。
-
通过调用next() 继续路由到链中的其他请求处理程序。
-
通过调用 next(err) 中止路由并转到 Express 错误处理程序。
express.static() 中间件
所以,这就是传递给app.use() 的函数所期望的。现在,让我们看一下您询问的两个示例。让我们从express.static()开始:
app.use(express.static(path.join(), "public"))
首先,这不是正确使用express.static()。我不确定你到底想要什么,但我会假设你的意思是这样的:
app.use(express.static(path.join(__dirname, "public")));
在这种情况下,express.static() 获取一些配置信息,这些信息是调用path.join(__dirname, "public") 的结果路径,并使用它来创建自定义中间件函数。因此,调用 express.static(path.join(__dirname, "public")) 返回一个函数,该函数期望使用我们之前讨论的三个中间件参数调用。它在逻辑上与此相同:
const publicPath = path.join(__dirname, "public");
const myStaticMiddleware = express.static(publicPath);
app.use(myStaticMiddleware);
这在逻辑上等价于:
const publicPath = path.join(__dirname, "public");
const myStaticMiddleware = express.static(publicPath);
app.use(function(req, res, next) {
myStaticMiddleware(req, res, next);
});
代码已分解为单独的步骤,以便您可以单独查看每个步骤。
如果您还不知道,express.static() 中间件的意义在于,如果传入请求与指定目录中的文件名完全匹配并且具有适当的文件类型,则从指定目录提供静态文件。
cors 中间件
第二个例子:
app.use(require("cors")())
让我们再次将其分解为各个步骤:
const cors = require("cors"); // load cors module
const corsMiddleware = cors(); // create cors middleware function
app.use(corsMiddleware); // register middleware with Express server
可以扩展为:
const cors = require("cors");
const corsMiddleware = cors();
app.use(function(req, res, next) {
corsMiddleware(req, res, next);
});
只是为了向您展示 corsMiddleware 是使用这三个参数调用的。
此特定中间件的目的是帮助配置对此请求的响应,以便接受跨源请求。