簡體   English   中英

異步函數的未處理承諾拒絕

[英]Unhandled promise rejection for async function

我的快遞后端收到未處理的承諾拒絕警告 我不完全確定如何解決這個問題,因為我以前從未使用過 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() 處理過的承諾。 (rejection id: 4) TypeError: 無法讀取 C:\\Users\\mokas\\Downloads\\MTA_Crunch\\server.js:62:49 at Layer.handle [as 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 [as 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 [as handle_request] ( C:\\Users\\mokas\\Downloads\\MTA_Crunch\\node_modules\\express\\lib\\router\\layer.js:95:5)

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);
    }


});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM