【问题标题】:Getting undefined for function call in Express render() [duplicate]Express render() 中的函数调用未定义 [重复]
【发布时间】:2015-02-14 13:30:15
【问题描述】:

我是 Node 和 Express 的新手,在从一个函数获取数据以作为 var 传递给另一个函数时遇到了麻烦。我想这是因为我没有正确处理回调和异步的东西,但希望能指导一下。

希望代码应该是解释性的。我正在尝试从 URL 检索一些 JSON 数据,并将其传递给 router.get 函数的 render() 方法。但是,不会发送任何内容(“未定义”)。但是,当我单独运行 getData() 函数时,它会返回正确的数据,如上所述,我认为这是因为我没有正确处理异步内容。

function getData(cid){
   var request = require("request");
   var cid ='XXXXXX' // hard code temp
   var baseUrl = "someurl.com"
   var apiKey = "XXXXXX"
   var cUrl = baseUrl+cid+'?api_key='+apiKey


  request({
    url: cUrl,
    json: true
  }, function (error, response, body) {

    if (!error && response.statusCode === 200) {
      console.log(body._embedded.assets); //Print the json response
      return body._embedded.assets
    }
  });
}

/* GET home page. */
router.get('/', function(req, res) {

  var LiveCards = getData()
  var cID = (req.query.cID
            ? req.query.cID
            : '14d115ff-1db7-4a6f-8648-ea64bc1a6597')
  var limit = Number(req.query.limit)

  res.render('index', {
      title: 'Cards',
      cards: LiveCards.slice(0,limit), <--- returning undefined at the moment
      limit: limit,
      activateSharetools: activateSharetools,
      cID: cID,
      cardsHeader: req.query.cardsHeader,
   });
});

任何指导表示赞赏。

【问题讨论】:

  • getData() 没有返回; LiveCard 将是 undefined
  • 嗯。好的。我正在尝试return body._embedded.assets。那不会返回数据吗?
  • 不,它不会返回数据。您的 get_data 函数中没有任何 return 语句。单独运行函数时,只看到console.log,看不到返回值。

标签: javascript node.js asynchronous express


【解决方案1】:

request 是异步函数,需要添加回调来获取数据并在请求完成后执行,如下所示:

function getData (cid, callback) {
   var request = require("request");
   var cid     = 'XXXXXX';
   var baseUrl = "someurl.com";
   var apiKey  = "XXXXXX";
   var cUrl    = baseUrl + cid + '?api_key=' + apiKey

  request({url: cUrl, json: true}, callback);
}

router.get('/', function (req, res) {
  var cID   = req.query.cID ? req.query.cID : '14d115ff-1db7-4a6f-8648-ea64bc1a6597');
  var limit = Number(req.query.limit);

  getData(cID, function (error, response, body) {
    if (!error && response.statusCode === 200) {
      res.render('index', {
        title: 'Cards',
        cards: body._embedded.assets.slice(0, limit), <--- returning undefined at the moment
        limit: limit,
        activateSharetools: activateSharetools,
        cID: cID,
        cardsHeader: req.query.cardsHeader,
      });
    } else {
      throw error;
    }
  });
});

【讨论】:

    猜你喜欢
    • 2014-07-07
    • 2016-11-13
    • 2013-12-17
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多