UnhandledPromiseRejection警告NodeJS

时间:2019-05-29 21:29:58

标签: node.js express error-handling

我正在尝试纠正错误,但我不知道如何解决。我搜索了互联网周围的内容,并尝试了一些类似Node UnhandledPromiseRejectionWarning的解决方案,但没有设法解决。

这是我的错误 enter image description here

这是我的代码

var express = require('express')
var session = require('express-session')
var bodyParser = require('body-parser')
var request = require('request-promise')
var mongoose = require('mongoose')

require('dotenv').config()

mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true })

var citySchema = new mongoose.Schema({
    name: String
})

var cityModel = mongoose.model('City', citySchema)

async function collectWeather(cities) {
    var weatherData = []
    for (var city_object of cities) {
        var city = city_object.name
        var url = `http://api.openweathermap.org/data/2.5/weather?q=${city}&units=metric&appid=e`
        request(url)
        var body = await request(url)
        var weatherJSON = JSON.parse(body)
        var weather = {
        city: city,
        temperature: Math.round(weatherJSON.main.temp),
        description: weatherJSON.weather[0].description,
        icon: weatherJSON.weather[0].icon,
        }
        weatherData.push(weather)
    }
    return weatherData
}

express()
    .use(express.static('static'))
    .use(bodyParser.urlencoded({extended: true}))
    .use(session({
        resave: false,
        saveUninitialized: true,
        secret: process.env.SESSION_SECRET
    }))

    .set('view engine', 'ejs')
    .set('views', 'view')

    .get('/', function(req, res) {
        cityModel.find({}, function(err, cities) {
            collectWeather(cities).then(function(result) {
                var weatherData = {weatherData: result}
                res.render('index', weatherData)
            })
        })
    })

    .post('/', function(req, res) {
        var newCity = new cityModel({name: req.body.city_name})
        newCity.save()
        res.redirect('/')
    })

    .listen(4000)

我仍然是node.js的初学者。

先谢谢您。

3 个答案:

答案 0 :(得分:1)

您应该始终兑现诺言,在这里错过了

collectWeather(cities).then(function(result) {
    var weatherData = {weatherData: result}
    res.render('index', weatherData)
}).catch(err => {

    //res.render('error', err)
})

答案 1 :(得分:1)

除了Rami的答案,您还应该修复newCity.save()操作。猫鼬save()返回thenables。所以您应该这样处理保存:

post('/', function(req, res) {
    var newCity = new cityModel({name: req.body.city_name})
    newCity.save()
    .then(result => {
        res.redirect('/')
    })
    .catch(err => {
        // handle error
        console.log(err);
        // render an error page for example.
    });  
});

答案 2 :(得分:1)

NodeJS使用异步,非阻塞调用而不是使用多个线程。它通过使用Promises(至少部分)来执行此操作。 Promise是一个对象,它表示稍后将完成的操作。

在线

        var body = await request(url)

调用request(url)返回一个Promise,而使用await导致该函数的其余部分推迟到Promise被解决之前。

如果请求失败,则拒绝Promise。您可以使用.catch(callback)返回的Promise的request(url)方法来处理这种情况。

可能还有其他方法可以执行此操作,但是我不知道它们没有使用异步/等待表示法。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await