为什么在使用app.use(express.static(path.join(...)))之前无法启动Express Middleware?

时间:2018-10-20 03:25:56

标签: node.js express cookies middleware

我正在尝试在非常简单的Express Back后端样板中调试问题。我有一个通用的中间件,我想对每一个打到服务器的请求都进行触发(本质上,我只是在尝试设置cookie。)

const express = require('express');
const path = require('path');
const uuidv4 = require('uuid/v4');
const cookieParser = require('cookie-parser')

const app = express();
app.use(cookieParser());

app.use(express.static(path.join(__dirname, 'client/build')));

app.use('/', (req, res, next) => {
    console.log(req.cookies)
    if (!req.cookies['audience_tracking_id']) {
        console.log('Processed Request - User Does Not Have Cookie.')
        const uniqueID = uuidv4();
        res.setHeader('Set-Cookie', [`audience_tracking_id=${uniqueID}`, `contentFocus=${randomProductName()}`]);
    }
    next();
});


app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname + '/client/build/index.html'))
});

app.use(function(err, req, res, next) {
    console.log(err)
    res.status(err.status || 500).send();
});

const port = process.env.PORT || 6000;

app.listen(port);

console.log(`Audience Service Host listening on ${port}`);

该应用程序包括一个托管在Heroku上的React前端,我正在通过Express在同一容器中提供静态构建文件。

问题是-无论我是使用Postman本地发送GET请求到本地主机中的此文件:6000,还是无论我是否访问Heroku上的容器,console.log()都无法触发-可能其余的中间件。

但是,如果我将这一行移动到cookie中间件下方:

app.use(express.static(path.join(__dirname, 'client/build')));

或者,如果我只是将其注释掉,则会触发我的中间件并显示console.log()。这是一个简单的修复程序,但我不知道为什么会这样发生,有人知道我使该中间件按原样失败的代码在做什么吗?

1 个答案:

答案 0 :(得分:1)

这是因为您的“静态文件”中间件将尝试将所有请求匹配到您的服务器:

app.use(express.static(path.join(__dirname, 'client/build')))

您的请求“ GET localhost:6000 / *”将在“ cookie”中间件之前路由到“静态文件”中间件。如果“静态文件”中间件发现文件存在,则响应将以文件结尾。如果不是,则中间件的操作与选项(贯穿)有关,您可以在server-static's option

上获得更多详细信息。

我建议为static file middlware设置根安装路径:

app.use("/dist", express.static(path.join(__dirname, 'client/build')))

如果要检查所有请求中的cookie,请使用以下格式:

app.use((req, res, next) => {
    // Do something
})