初学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()
};
答
您的getData
函数异步调用request
,然后立即返回responseString
的值,该值始终为''
。
想想代码:
module.exports= {
test: getData()
};
这到底是怎么回事?您
- 立即执行你的
getData
功能,其中:- 执行
request
,并 - 回报
''
- 执行
- 与单场包含此结果
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 });
});
});
这是关于异步Javascript编程的最常见的重复问题之一。 – jfriend00