【问题标题】:UnhandledPromiseRejectionWarning NodeJSUnhandledPromiseRejectionWarning NodeJS
【发布时间】:2019-05-29 21:29:57
【问题描述】:

我正在尝试修复我的错误,但我不知道如何修复它。我已经在互联网上搜索并尝试了一些类似Node UnhandledPromiseRejectionWarning 的解决方案,但我没有设法修复它。

这是我的错误

这是我的代码

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 的初学者。

提前谢谢你。

【问题讨论】:

    标签: node.js express error-handling


    【解决方案1】:

    除了 Rami 的回答之外,您还应该修复 newCity.save() 操作。 Mongoose 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】:

      NodeJS 使用异步、非阻塞调用而不是使用多个线程。它通过使用 Promises 来做到这一点(至少部分地)。 Promise 是一个对象,表示稍后将完成的事情。

      上线

              var body = await request(url)
      

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

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

      可能还有其他方法可以做到这一点,但我不知道它们没有使用 async/await 表示法。

      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

      【讨论】:

        【解决方案3】:

        你应该总是兑现你的承诺,你在这里错过了

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-27
          • 1970-01-01
          • 2018-03-17
          • 1970-01-01
          • 2018-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多