所以我有这个小的Express.js应用程序,它接受一个以“城市”为主体的POST请求。应用程序处理呼叫并为此使用外部服务。我试图从REST控制器中分离出“纯”逻辑以保持其清洁,但不知何故,当我调用“天气”方法时,它不会返回任何内容,即使我传递的字符串是有效的宾语。 我的猜测是,异步调用存在问题,但我不认为自己处于这个位置,自己解决它。
RestController.js
module.exports = (function() {
var router = require('express').Router()
var bodyParser = require('body-parser')
var weather = require('./weather')
router.use(bodyParser.urlencoded({ extended: true }))
router.use(bodyParser.json())
//TODO DATABASE CONNECTION
//REST CONTROLLER
router.get('/', function(req, res) {
res.json({response: 'Hello world!'})
})
router.post('/weather', function(req, res) {
var r = weather(req.body.city)
res.send(r)
})
return router
})();
weather.js
var request = require('request')
module.exports = function(loc) {
request('http://api.openweathermap.org/data/2.5/weather?q='+loc+'&units=metric&APPID=API_TOKEN', function(err , ires) {
if(!err) {
json = JSON.stringify({temp: JSON.parse(ires.body).main.temp, name: JSON.parse(ires.body).name})
console.log(json)
return json
}
else {
return err
}
})
};
致以最诚挚的问候,
添
答案 0 :(得分:1)
您应该将回调传递给天气功能,以便在完成后处理。 e.g。
module.exports = function(loc, callback) {
request('http://api.openweathermap.org/data/2.5/weather?q='+loc+'&units=metric&APPID=API_TOKEN', function(err , ires) {
if(!err) {
json = JSON.stringify({temp: JSON.parse(ires.body).main.temp, name: JSON.parse(ires.body).name})
console.log(json)
callback(null, json)
} else {
callback(err)
}
})
};
然后在你的程序中使用如下:
router.post('/weather', function(req, res) {
var r = weather(req.body.city, function (e, result) {
if (e) return res.status(500).send({error: e});
res.send(result)
})
})
这是标准节点模式(有更好的节点模式)。节点是非阻塞的,因此它不会等待您的天气请求完成。一旦最终调用回调,它最终将在事件循环上处理它。