为什么 Express 中间件在 app.use(express.static(path.join(...))) 之前不触发;
Why does Express Middleware not fire when preceded by app.use(express.static(path.join(...)));
我正在尝试解决我非常简单的 express 后端样板中的一个问题。我有一个通用中间件,我想在每个到达服务器的请求中触发它(本质上,我只是想设置一个 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 在本地向 localhost:6000 中的这个文件发送 GET 请求,还是我访问 Heroku 上的容器,console.log()
都无法触发 - 也许其余的中间件。
但是,如果我将此行移到 cookie 中间件下方:
app.use(express.static(path.join(__dirname, 'client/build')));
或者,如果我只是将其注释掉,我的中间件就会触发并且 console.log() 出现。这是一个简单的修复,但我不知道为什么会发生这种情况,有谁知道我在这段代码中做错了什么导致中间件按原样失败?
这是因为您的 "static file" 中间件将尝试将所有请求匹配到您的服务器:
app.use(express.static(path.join(__dirname, 'client/build')))
您的请求 "GET localhost:6000/*" 将在 "cookie" 中间件之前路由到 "static file" 中间件。如果 "static file" 中间件发现文件存在,响应将以文件结束。如果不是,则中间件的操作与选项(fallthrough)有关,您可以在 server-static's option
上获得更多详细信息
我建议为static file middlware设置root挂载路径:
app.use("/dist", express.static(path.join(__dirname, 'client/build')))
如果要检查所有请求中的 cookie,请使用此格式:
app.use((req, res, next) => {
// Do something
})
我正在尝试解决我非常简单的 express 后端样板中的一个问题。我有一个通用中间件,我想在每个到达服务器的请求中触发它(本质上,我只是想设置一个 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 在本地向 localhost:6000 中的这个文件发送 GET 请求,还是我访问 Heroku 上的容器,console.log()
都无法触发 - 也许其余的中间件。
但是,如果我将此行移到 cookie 中间件下方:
app.use(express.static(path.join(__dirname, 'client/build')));
或者,如果我只是将其注释掉,我的中间件就会触发并且 console.log() 出现。这是一个简单的修复,但我不知道为什么会发生这种情况,有谁知道我在这段代码中做错了什么导致中间件按原样失败?
这是因为您的 "static file" 中间件将尝试将所有请求匹配到您的服务器:
app.use(express.static(path.join(__dirname, 'client/build')))
您的请求 "GET localhost:6000/*" 将在 "cookie" 中间件之前路由到 "static file" 中间件。如果 "static file" 中间件发现文件存在,响应将以文件结束。如果不是,则中间件的操作与选项(fallthrough)有关,您可以在 server-static's option
上获得更多详细信息我建议为static file middlware设置root挂载路径:
app.use("/dist", express.static(path.join(__dirname, 'client/build')))
如果要检查所有请求中的 cookie,请使用此格式:
app.use((req, res, next) => {
// Do something
})