Nodejs-带有等待函数的超时(如果没有完成,则抛出新的Error)



这是我的代码:

router.post('/route', indexValidator, async (req, res, next) => {
try {
const data = await action.access(req);
res.send(data);
} catch (err) {
next(err);
}
});

如果"await-action.access(req(;"耗时60秒以上。我该怎么做?

我试过这个:

router.post('/route', indexValidator, async (req, res, next) => new Promise(async (resolve, rej) => {
try {
let data;
setTimeout(async () => {
rej(new Error('No more time'));
}, 3000);
resolve(data = await action.access(req));
res.send(data);
} catch (err) {
next(err);
}
}));

但代码一直在运行,当超时运行时,我会收到以下错误:

(node:8765) UnhandledPromiseRejectionWarning: Error: No more time

因此,在这个问题中,如果在60秒内获得数据,则必须清除超时。所以你可以做一些类似的事情

router.post('/route', indexValidator, async (req, res, next) => new Promise(async (resolve, rej) => {
try {
let data;
const timer = setTimeout(async () => {
rej(new Error('No more time'));
}, 1000 * 60);
const data = await action.access(req);
clearTimeout(timer)
resolve(data);
res.send(data);
} catch (err) {
next(err);
}
}));

为什么要在路由器处理程序中创建promise。您应该向客户端发送一条错误消息,而不是抛出错误。试试下面的例子。希望这对你有帮助。

var apiRouter = require('express').Router();
apiRouter.post('/', async(req, res, next) => {
console.log('Request Came..');
setTimeout(() => {
next(new Error('TimedOut'));
}, 2000);
try {
var data = await test();
res.send(data);
} catch (err) {
console.log('Error');
}
});
function test() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('response');
}, 6000);
});
}
module.exports = apiRouter;

相关内容

最新更新