我正在尝试在非常简单的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()。这是一个简单的修复程序,但我不知道为什么会这样发生,有人知道我使该中间件按原样失败的代码在做什么吗?
答案 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
})