Node.js Nodejs-带等待函数的超时(如果未完成,则抛出新错误)

Node.js Nodejs-带等待函数的超时(如果未完成,则抛出新错误),node.js,Node.js,这是我的代码: router.post('/route', indexValidator, async (req, res, next) => { try { const data = await action.access(req); res.send(data); } catch (err) { next(err); } }); 如果'wait action.access(req);'需要60秒以上的时间。我该怎么做 我试过这个: router.p

这是我的代码:

router.post('/route', indexValidator, async (req, res, next) => {
  try {
    const data = await action.access(req);
    res.send(data);
  } catch (err) {
    next(err);
  }
});
如果'wait 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);
    }
 }));

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

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;

(节点:18211)未经处理的PromisejectionWarning:错误:在您收到错误的时间之后没有更多时间了,主要是3秒?我已将超时时间更改为60秒。