【问题标题】:Having difficulties in understand the flow of middleware when using express.static('public')使用 express.static('public') 时难以理解中间件的流程
【发布时间】:2020-12-22 08:50:24
【问题描述】:

我现在正在学习express,我很难理解express中的中间件流程。 例如,如果我有以下代码 从“快递”导入快递;

const app = express();

app.use((req,res,next)=>{
    console.log("app.use");
    res.send("hello")
})

app.use(express.static('public'));


app.listen(1234,()=>{
    console.log("started at port:1234");
});

当我在浏览器中输入 localhost:1234 时,我将在终端 started at port:1234, app.use 和浏览器中获得以下信息。我理解这是因为第一个中间件有 res.send("hello") ,因此它发回 "hello" 而不将 res 传递给 app.use(express.static('public')) (公用文件夹有一个索引.html 在这种情况下未显示)

但是当我稍微修改代码时,我不再了解中间件的流程

const app = express();

app.use(express.static('public'));

app.use((req,res,next)=>{
    console.log("app.use");
    res.send("hello")
})


app.listen(1234,()=>{
    console.log("started at port:1234");
});

这一次,当我在浏览器中键入 localhost:1234 时,我将在终端 started at port:1234 app.use app.use app.use 和 index.html 中得到以下内容。 首先,我不明白为什么我的浏览器中没有“你好”。我了解app.use(express.static('public')); 但是 app.use 出现在app.use(express.static('public')); 内部有一个 res.send("hello") 之后,因此发回的请求应该是“hello”而不是 index.html? 其次,为什么终端显示“app.use”不止一次? app.use((req,res,next)=>{console.log("app.use");res.send("hello")}) 应该只执行一次吗?更不用说它里面有一个 res.send 。 任何人都可以请给我解释一下吗?感谢您的帮助

【问题讨论】:

    标签: express middleware


    【解决方案1】:

    中间件定义的顺序很重要,当中间件堆栈中的第一个中间件与请求路径匹配时,它将负责处理请求。

    我会举个例子

    app.use('/', (req, res, next) => {
        res.send('First middleware');
    });
    app.use('/', (req, res, next) => {
        res.send('Second middleware');
    }
    

    如您所见,两个中间件具有相同的路径。当请求 URL 为http://localhost:[port_number]/ 时,中间件堆栈中的第一个请求处理程序将被执行,第二个将不会执行。

    一般来说,当您在后端导航到任何网站的根路径时,服务器会查找名为 index.html 的文件,这是许多 Web 服务器的默认配置。因此,当您导航到 express 应用程序的根路径时,express 提供的所有静态文件所在的目录都包含一个名为 index.html 的文件,其中 express.static 中间件附加在您的个性化中间件之前,如下所示。

    app.use(express.static('public'));
    
    app.use((req,res,next)=>{
        console.log("app.use");
        res.send("hello")
    })
    

    public 目录内的index.html 文件将被渲染,而不是hello

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2019-11-29
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多