簡體   English   中英

nodejs api請求函數錯誤處理崩潰應用

[英]nodejs api request function error handling crashes app

我正在嘗試進行 api 調用並將其傳遞給將其存儲到 mongodb 的函數。 問題是當我嘗試處理錯誤而不是重定向到錯誤頁面時,整個站點都會崩潰。 我所有的其他函數都可以工作,只是包含 api 調用的請求函數不起作用。

我沒有重定向,而是只在終端中收到錯誤消息。

這是我的代碼:

index.js

router.post('/',async function(req,res){
  var {title,date,loc,count, save,del,update,csv} = req.body;
  var {username} = req.session;
  console.log(req.body);
  var url = `http://api.openweathermap.org/data/2.5/weather?q=${loc}&appid=${API_KEY}&units=metric`

  if(save){
    //weather api       
    request({ url: url, json: true }, async function (error, response) {
      if(error){
        throw new Error ('type error');
      }
      else{
        console.log('Current weather: '
                + response.body.main.temp
                + ' degrees celsius'
        );
        let w = JSON.stringify(response.body.main.temp);
        console.log(w)
        await db.addItem(username,title, loc, count, w, date);
      }
    });
    res.redirect('/');
  }  

應用程序.js

app.use('/', indexRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

這是應用程序崩潰時我的終端的外觀:終端錯誤消息

如果request調用的 else 語句中發生錯誤,您還沒有描述該怎么做。 因此,如果發生錯誤,它將崩潰。

由於您在回調中使用async...await來插入數據庫,因此您可以通過將其包裝在try...catch中並將重定向移動到 catch 中來獲得所需的功能:

request({ url: url, json: true }, async function (error, response) {
  if(error){
    throw new Error ('type error');
   } else {
     try {
      console.log('Current weather: '
        + response.body.main.temp
        + ' degrees celsius'
      );
      let w = JSON.stringify(response.body.main.temp);
      console.log(w)
      await db.addItem(username,title, loc, count, w, date);
    } catch (error) {
      console.log(error);
      res.redirect('/');
    }
  }
});

但是, throw new Error('type error')仍然會導致應用程序在此處崩潰。 如果您還想在這種情況下重定向,那么您也可以在那里添加res.redirect('/')而不是拋出,或者將整個request調用包裝在try...catch中,以便 catch 塊也將捕獲拋出的類型錯誤:

try {
   request({ url: url, json: true }, async function (error, response) {
      if(error){
        throw new Error ('type error');
      }
      else{
        console.log('Current weather: '
                + response.body.main.temp
                + ' degrees celsius'
        );
        let w = JSON.stringify(response.body.main.temp);
        console.log(w)
        await db.addItem(username,title, loc, count, w, date);
      }
    });
} catch (error) {
  res.redirect('/')
}

暫無
暫無

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

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