我在我的项目中遇到了这个问题,我们快速解决了将中间件一分为二的问题。您在路由之前添加第一部分,然后在“next()”之后添加要执行的内容,然后再添加。如果您需要访问相同的对象实例或其他内容,您始终可以将其保存在请求本地。
我的例子:
const express = require('express');
const app = express();
const port = 5050;
const wait = (milliseconds) =>
new Promise((res, rej) => {
setTimeout(() => {
res();
}, milliseconds);
});
const middleware = async (req, res, next) => {
console.log('- 1');
await wait(10);
console.log('- 2');
next();
console.log('- 3');
await wait(10);
console.log('- 4');
console.log('');
};
app.use(middleware);
app.get('/', async (req, res, next) => {
console.log('-- 1');
await wait(10);
console.log('-- 2');
console.log('hello');
res.send('Hello World!');
console.log('-- 3');
await wait(10);
console.log('-- 4');
next();
return;
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});
这将是您遇到的问题。它会在这些行中打印一些东西。
- 1
- 2
-- 1
- 3
-- 2
hello
-- 3
- 4
-- 4
解决办法:
const express = require('express');
const app = express();
const port = 5050;
const wait = (milliseconds) =>
new Promise((res, rej) => {
setTimeout(() => {
res();
}, milliseconds);
});
const middleware1 = async (req, res, next) => {
console.log('- 1');
await wait(10);
console.log('- 2');
next();
};
const middleware2 = async (req, res, next) => {
console.log('- 3');
await wait(10);
console.log('- 4');
console.log('');
next();
};
app.use(middleware1);
app.get('/', async (req, res, next) => {
console.log('-- 1');
await wait(10);
console.log('-- 2');
console.log('hello');
res.send('Hello World!');
console.log('-- 3');
await wait(10);
console.log('-- 4');
next();
return;
});
app.use(middleware2);
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});
您将中间件一分为二,以确保中间件 2 仅在路由中的所有内容都执行后才执行。你会得到如下输出:
- 1
- 2
-- 1
-- 2
hello
-- 3
-- 4
- 3
- 4