UnhandledPromiseRejectionWarning NodeJS

Я пытаюсь исправить свою ошибку, но я не знаю, как я могу это исправить. Я искал в Интернете и пробовал некоторые решения, такие как Node UnhandledPromiseRejectionWarning, но мне не удалось это исправить.

это моя ошибка UnhandledPromiseRejectionWarning NodeJS

И это мой код

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.

Заранее спасибо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
174
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

    //res.render('error', err)
})
Ответ принят как подходящий

В дополнение к ответу Рами вы должны исправить операцию newCity.save(). Mongoose 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.info(err);
        // render an error page for example.
    });  
});

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

На линии

        var body = await request(url)

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

Если запрос терпит неудачу, обещание вместо этого отклоняется. Вы можете справиться с этим случаем, используя метод .catch(callback) обещания, возвращаемого request(url).

Могут быть и другие способы сделать это, но я не знаю о них, так как не использовал нотацию async/await.

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

Другие вопросы по теме