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