Nodejs middleOne 如何打印到 middleTwo await 之后的结果 "express": "^4.18.2"
const express = require('express'); const app = express();
const vv = { }
const middleOne = async (req, res, next) => { await next(); console.log(vv, 'middle1'); }
const haha = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve('hahahhahhah'); }, 3000); }) }
const middleTwo = async (req, res, next) => { const result = await haha(); vv.uname = result; console.log(vv, 3232); next(); }
app.use(middleOne); app.use(middleTwo);
app.get('/', (req, res, next) => { res.send({ 'cute': 'murphy' }); })
app.listen(3002, (res) => { console.log(res, 22); })
Nodejs middleOne 如何打印到 middleTwo await 之后的结果 "express": "^4.18.2"
express 4 好像不支持 async function ,更新到 5 或者用 koa 吧
支持的 · 中间件 里面可以 await 一个异步结果·
可以用不代表支持呀,你这里就是打印不到 middleTwo await 之后的结果,就是因为 express 在调用 next() 时不是返回一个 promise ,导致你没办法 await 后一个 middleware 的 async 函数。
另外还有一个大问题就是这些 async 函数如果抛出异常的话,express 没办法捕获到
如果真的要用 async function ,可以这样用:
let resolve;
const promise = new Promise(r => {
resolve = r;
});
const middleOne = async (req, res, next) => {
next();
const vv = await promise;
console.log(vv, “middle1”);
};
const haha = () => {
return new Promise((resolve, _reject) => {
setTimeout(() => {
resolve(“hahahahah”);
});
});
};
const middleTwo = async (req, res, next) => {
try {
const result = await haha();
resolve({
name: result,
});
next();
} catch (ex) {
next(ex);
}
};
在 Node.js 中,使用 async
和 await
可以帮助我们处理异步操作,并确保代码按照我们期望的顺序执行。对于你提到的 middleOne
和 middleTwo
,假设它们都是异步函数,你可以通过以下方式确保 middleOne
打印的结果是在 middleTwo
的 await
之后。
首先,确保你已经安装了 express
:
npm install express@4.18.2
接下来,你可以创建一个简单的 Express 应用,并演示如何使用 async
和 await
来控制异步函数的执行顺序:
const express = require('express');
const app = express();
app.get('/', async (req, res) => {
const middleOne = async () => {
console.log('This is middleOne');
};
const middleTwo = async () => {
return new Promise((resolve) => {
setTimeout(() => {
console.log('middleTwo await completed');
resolve();
}, 1000);
});
};
await middleTwo();
await middleOne();
res.send('Check your console for logs');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
在这个例子中,middleTwo
是一个返回 Promise 的异步函数,它模拟了一个耗时操作(例如,数据库查询或 API 调用)。middleOne
只是一个简单的异步函数,用于打印日志。通过先 await
middleTwo
,然后再 await
middleOne
,你可以确保 middleOne
的日志是在 middleTwo
的日志之后打印的。