为什么我的“必需”函数没有返回任何内容?

时间:2015-11-11 22:35:59

标签: javascript node.js express require

所以我有这个小的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
    }

  })
};

致以最诚挚的问候,

1 个答案:

答案 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)
    })
})

这是标准节点模式(有更好的节点模式)。节点是非阻塞的,因此它不会等待您的天气请求完成。一旦最终调用回调,它最终将在事件循环上处理它。