【问题标题】:what happens in app.use(express.static) and app.use(require("cors")()) and what middlewares areapp.use(express.static) 和 app.use(require("cors")()) 发生了什么以及中间件是什么
【发布时间】:2021-12-05 08:07:31
【问题描述】:

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

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() 中发生了什么以及中间件是什么..

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

【问题讨论】:

  • 您可以将任何 http 请求视为按顺序跳过一堆中间件。基本上,请求通过第一个中间件,然后是第二个,依此类推,直到有东西发送响应。您可以通过编写 app.use((req,res,next)=>{whatever code you want...; next ();}) 添加自己的中间件

标签: node.js express middleware


【解决方案1】:

背景

有几个部分可以解释这一点。首先,关闭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")) 返回一个函数,该函数期望使用我们之前讨论的三个中间件参数调用。它在逻辑上与此相同:

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 是使用这三个参数调用的。

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

【讨论】:

  • 我不小心删除了上一条消息.. :D 谢谢!我没想到这个漂亮的答案。你把所有的事情都告诉我了。是的,你有复选标记:)
猜你喜欢
  • 2018-02-11
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
相关资源
最近更新 更多