Estoy tratando de hacer una llamada a la API y pasarla a una función que la almacene en mongodb. El problema es que todo el sitio falla cuando trato de manejar los errores en lugar de redirigir a la página de error. Todas mis otras funciones funcionan, es solo la función de solicitud que contiene la llamada API que no funciona.
En lugar de redirigir, solo recibo los mensajes de error en la terminal.
Aquí está mi código para ello:
índice.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('/'); }aplicación.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'); });Así es como se ve mi terminal cuando la aplicación falla: mensaje de error del terminal
No ha descrito qué hacer si se produce un error en la instrucción else de la llamada de request . Entonces, si ocurre un error, se bloqueará.
Dado que está utilizando async...await en la devolución de llamada para insertar en la base de datos, puede obtener la funcionalidad que desea envolviéndola en un bloque try...catch y moviendo la redirección a 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('/'); } } }); Sin embargo, el throw new Error('type error') aún hará que la aplicación se bloquee aquí. Si también desea redirigir en este caso, entonces puede agregar un res.redirect('/') allí también en lugar de lanzar, o envolver toda la llamada de request en un try...catch para que el bloque de captura también atrapa ese error de tipo lanzado:
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('/') }