初学Node.JS,没有按预期返回

问题描述:

我从字面上刚开始使用nodeJS,并且在过去的8个小时里一直在干扰它。我之前完成了J2EE和.NET,并且也想进入NodeJS。初学Node.JS,没有按预期返回

我试图从Data.js文件获取响应时遇到问题。我可以成功地将数据串联起来,但由于某种原因,我无法将其返回。它在index.js路由器中结束为null或空字符串(它的默认值)。我已经在下面的Data.js代码中解释了注释。

谢谢你提前告诉我,我怎样才能提高我的代码:) 我仍然有很多的概念,了解

index.js

var express = require('express'); 
var router = express.Router(); 

/* GET home page. */ 
router.get('/', function(req, res, next) { 
var Data = require('../public/javascripts/Data'); 
var responseString = Data.test; 

    res.render('index', { d: responseString }); 
    console.log(responseString) 
}); 

module.exports = router; 

Data.js

var request = require('request'), 
cheerio = require('cheerio'), 
responseTitles = [], 
responseUrls = [], 
responseJSONArray = [], 
responseTotalNumber = 0, 
responseString = ""; 


function getData(){ 
request('URL',function(err,response,body){ 
    console.log("requesting..") 
    if(!err && response.statusCode == 200){ 
     console.log("success..") 
     var $ = cheerio.load(body); 
     var data = []; 
     data = $('span.titletext'); 
     data.each(function(i){ 
      responseTitles.push(data[i].children[0].data); 
      responseUrls.push(data[i].parent.attribs.url); 
      responseTotalNumber = i; 

      responseJSONArray.push([{index: i, Title: data[i].children[0].data, url: data[i].parent.attribs.url}]) 
     }); 
     responseString = JSON.stringify(responseJSONArray); 
     //At this point, responseString has all the data but 
     //if I put the return here, it doesn't return anything 
    } 
    }); 
//At this point responseString returns "". And so it returns an empty string 
return responseString; 
} 


module.exports= { 
    test: getData() 
}; 
+0

这是关于异步Javascript编程的最常见的重复问题之一。 – jfriend00

您的getData函数异步调用request,然后立即返回responseString的值,该值始终为''

想想代码:

module.exports= { 
    test: getData() 
}; 

这到底是怎么回事?您

  1. 立即执行你的getData功能,其中:
    • 执行request,并
    • 回报''
  2. 与单场包含此结果test导出你的模块('') 。

所以你基本上是这样做的:

module.exports = { 
    test: '' 
}; 

我以为是不是你的意图。你可能想要的东西接近这个:

module.exports = { 
    test: getData 
}; 

不含括号意味着你正在返回的函数本身而不是调用函数的结果。

由于您正在异步工作,您可能希望包含回调参数或返回来自您的getData函数的承诺,以便访问请求的结果。也许是这样的:

Data.js:

function getData (cb) { 
    request('URL', function (err, response, body) { 

     ... 

     responseString = JSON.stringify(responseJSONArray); 
     cb(responseString); 
    }); 
} 

module.exports = { 
    test: getData 
}; 

,然后用它是这样的:

指数。js

var data = require('../public/javascripts/Data'); 
router.get('/', function (req, res, next) { 
    data.test(function (responseString) { 
     res.render('index', { d: responseString }); 
    }); 
}); 
+0

那是有道理的,但我该如何解决它?我很抱歉,甚至以为我曾在.NET中使用过异步调用,但在NodeJS中我仍然没有得到这个概念。 – ExPlOiD

+0

是否有可能只返回responseString而不是实际上整个函数? responseString变量确实具有所有数据,在我按照注释中所述对字符串化的responseJSONArray变量进行了处理后。但似乎是因为该方法是异步的,它没有等待响应 – ExPlOiD

+0

@ExPlOiD看看我为你抛出的例子。无法返回'resultString'本身 - 在对'request'的调用完成后,您必须异步访问它。 –