[英]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.