我正在尝试纠正错误,但我不知道如何解决。我搜索了互联网周围的内容,并尝试了一些类似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的初学者。
先谢谢您。
答案 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