UnhandledPromiseRejectionWarning NodeJS - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь исправить свою ошибку, но я не знаю, как я могу это исправить. Я искал в интернете и попробовал некоторые решения, такие как 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 ]

1 голос
/ 30 мая 2019

В дополнение к ответу Рами, вы должны исправить newCity.save() операцию.Мангуст save () возвращает свойства.Таким образом, вы должны обрабатывать сохранение, как это:

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.
    });  
});
1 голос
/ 30 мая 2019

NodeJS использует асинхронные неблокирующие вызовы вместо использования нескольких потоков. Это делается (по крайней мере частично) с помощью Обещаний. Promise - это объект, представляющий что-то, что закончится позже.

На линии

        var body = await request(url)

вызов request(url) возвращает обещание, а использование await приводит к тому, что остальная часть функции откладывается до разрешения обещания.

Если запрос не выполнен, Обещание отклоняется. Вы можете справиться с этим случаем, используя метод .catch(callback) Обещания, возвращаемый 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

0 голосов
/ 30 мая 2019

Вы всегда должны ловить свои обещания, вы пропустили это здесь

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

    //res.render('error', err)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...