Nodejs middleOne 如何打印到 middleTwo await 之后的结果 "express": "^4.18.2"

发布于 1周前 作者 phonegap100 来自 nodejs/Nestjs

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"

5 回复

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 中,使用 asyncawait 可以帮助我们处理异步操作,并确保代码按照我们期望的顺序执行。对于你提到的 middleOnemiddleTwo,假设它们都是异步函数,你可以通过以下方式确保 middleOne 打印的结果是在 middleTwoawait 之后。

首先,确保你已经安装了 express

npm install express@4.18.2

接下来,你可以创建一个简单的 Express 应用,并演示如何使用 asyncawait 来控制异步函数的执行顺序:

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 的日志之后打印的。

回到顶部