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('/')
}
我正在尝试进行 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('/')
}