异步功能未处理的承诺拒绝

时间:2019-12-11 03:47:43

标签: javascript node.js express backend

我的 express后端收到未处理的承诺拒绝警告。我不确定如何解决此问题,因为我从未使用过Express以前。

//run function
function run(TrainLine, StartStation, EndStation,ArrivalTime,ArrivalDate) {
  return new Promise((resolve, reject) => {
    var process = spawn('python3',["./python/main.py",
                            TrainLine,
                            StartStation,
                            EndStation,
                            ArrivalTime,
                            ArrivalDate
                            ] );

    const out = []
    process.stdout.on(
      'data',
      (data) => {
        out.push(data.toString());
        logOutput('stdout')(data);
      }
    );

    const err = []
    process.stderr.on(
      'data',
      (data) => {
        err.push(data.toString());
        logOutput('stderr')(data);
      }
    );

    process.on('exit', (code, signal) => {
      logOutput('exit')(`${code} (${signal})`)
      if (code !== 0) {
        reject(new Error(err.join('\n')))
        return
      }
      try {
        resolve(JSON.parse(out[0]));
      } catch(e) {
        next(e);
      }
    });
  });
}

app.post('/commuterequest',async function(request,response){
    console.log(request.body);

    const outputjson =await run(request.body.TrainLine,request.body.StartStation, request.body.EndStation, request.body.ArrivalTime, request.body.ArrivalDate);

    console.log(outputjson);

    response.json(outputjson);
});

app.get('/express_backend', (req, res) => {
  res.send({ express: 'connected to backend!' });
});

这是我定义的运行功能代码。我正在尝试将try catch添加到原始的await函数中。鉴于代码的语法,我不太确定该怎么做。

完整错误消息

UnhandledPromiseRejectionWarning:未处理的承诺拒绝。引发此错误的原因可能是抛出了一个没有catch块的异步函数,或者是拒绝了一个.catch()无法处理的承诺。 (拒绝ID:4) TypeError:无法读取未定义的属性“ TrainLine”     在C:\ Users \ mokas \ Downloads \ MTA_Crunch \ server.js:62:49     在Layer.handle上[作为handle_request](C:\ Users \ mokas \ Downloads \ MTA_Crunch \ node_modules \ express \ lib \ router \ layer.js:95:5)     在下一个(C:\ Users \ mokas \ Downloads \ MTA_Crunch \ node_modules \ express \ lib \ router \ route.js:137:13)     在Route.dispatch(C:\ Users \ mokas \ Downloads \ MTA_Crunch \ node_modules \ express \ lib \ router \ route.js:112:3)     在Layer.handle上[作为handle_request](C:\ Users \ mokas \ Downloads \ MTA_Crunch \ node_modules \ express \ lib \ router \ layer.js:95:5)     在C:\ Users \ mokas \ Downloads \ MTA_Crunch \ node_modules \ express \ lib \ router \ index.js:281:22     在Function.process_params(C:\ Users \ mokas \ Downloads \ MTA_Crunch \ node_modules \ express \ lib \ router \ index.js:335:12)     在下一个(C:\ Users \ mokas \ Downloads \ MTA_Crunch \ node_modules \ express \ lib \ router \ index.js:275:10)     在expressInit(C:\ Users \ mokas \ Downloads \ MTA_Crunch \ node_modules \ express \ lib \ middleware \ init.js:40:5)     在Layer.handle上[作为handle_request](C:\ Users \ mokas \ Downloads \ MTA_Crunch \ node_modules \ express \ lib \ router \ layer.js:95:5)

1 个答案:

答案 0 :(得分:0)

Express的路由处理程序具有3个参数。第三个参数是可选参数,它具有处理异步处理程序的拒绝错误的作用。因此,您需要将拒绝的错误传递给它。

app.post('/commuterequest',async function(request,response, next){
    console.log(request.body);

    try {
       const outputjson =await run(request.body.TrainLine,request.body.StartStation, request.body.EndStation, request.body.ArrivalTime, request.body.ArrivalDate);
       console.log(outputjson);

       response.json(outputjson);
    } catch (e) {
       next(e);
    }


});