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('/');
  }  

app.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');
});

这是应用程序崩溃时我的终端的样子: terminal error message

您没有描述如果 request 调用的 else 语句中发生错误该怎么办。因此,如果发生错误,它将崩溃。

由于您在回调中使用 async...await 插入数据库,因此您可以通过将其包装在 try...catch block 中并将重定向移动到捕获中来获得所需的功能:

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('/')
}