app.use(express.static) 和 app.use(require("cors")()) 中发生了什么以及中间件是什么

what happens in app.use(express.static) and app.use(require("cors")()) and what middlewares are

前几天开始用express。 我真的不明白发生了什么:

const express = require("express")
const app = express()

app.use(express.static(path.join(), "public")) 
    
app.use(require("cors")())

app.listen(3000, () => console.log("running"))

第一个例子对我有用,但我不太明白。 基本上我不明白 app.use() 中发生了什么以及中间件是什么..

有人可以帮助我吗? 我读了很多博客,但我没有明白:(

背景

有几个部分可以对此进行解释。首先,off 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 对象中的输入对该输入进行某种处理(取决于中间件函数的用途),然后执行三件事之一:

  1. 使用类似 res.send() 的方式发送响应,在这种情况下,请求已被处理,响应已发送,不会进行进一步的路由。

  2. 通过调用 next().

    继续路由到链中的其他请求处理程序
  3. 通过调用 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")) returns 一个预期使用我们之前讨论的三个中间件参数调用的函数。它在逻辑上与此相同:

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。

此特定中间件的目的是帮助配置对此请求的响应,以便接受跨源请求。