gpt4 book ai didi

javascript - 初学者 Node.JS,未按预期返回

转载 作者:行者123 更新时间:2023-12-02 14:55:35 25 4
gpt4 key购买 nike

我刚刚开始使用 NodeJS,并且在过去的 8 个小时里一直在研究它。我之前接触过 J2EE 和 .NET,也想接触 NodeJS。

我在尝试从 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;

数据.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()
};

这里发生了什么?你是

  1. 立即执行您的 getData 函数,该函数:
    • 执行请求,并且
    • 返回''
  2. 使用包含此结果的单个字段 test 导出模块 ('')。

所以你实际上是在这样做:

module.exports = {
test: ''
};

我认为这不是您的意图。您可能想要更接近此的东西:

module.exports = {
test: getData
};

排除括号意味着您将返回函数本身,而不是调用函数的结果

当您异步工作时,您可能需要包含回调参数或从 getData 函数返回一个 Promise,以便访问请求的结果。也许是这样的:

数据.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 - 初学者 Node.JS,未按预期返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35833642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com