>基本上,我正在尝试从网站中抓取一些数据,并对绑定到http.request
的"end"事件的回调函数执行DOM提取,删除和更新。
我也从'end'
事件回调返回了数据,但它在我的路由回调函数中没有收到。我在那里得到undefined
。
下面是代码块:
var scraper = {
extractEmail: function (directoryName) {
var result = getDirectory(directoryName);
if (result !== 404) {
var protocol = result.https ? https : http;
protocol.request({
host: 'somevalue.net',
method: "GET"
}, function (res) {
var data = '';
res.on('data', function (chunk) {
data += chunk;
});
res.on('end', function () {
return data;
});
})
.on('error', function (err) {
return err;
})
.end();
//return data;
}
else {
//return "Failed";
}
}
};
这是路由.js函数:
app.get('/:directory', function (req, res) {
var n = scraper.extractEmail(req.params.directory);
console.log(n);
res.send(n);
});
在这里我也没有得到n
的价值.
您的"var 刮板"是否也在路由.js文件中?我想不是,你无法访问另一个js文件,为此,请使用 module.exports。
例如。
// module.js
var name = "foobar";
// export it
exports.name = name;
Then, in route.js...
> //route.js
> // get a reference to your required module
> var myModule = require('./module');
> //correct path to folder where your above file is
> // name is a member of myModule due to the export above
> var name = myModule.name;
不能从异步回调返回值。好吧,你可以,但它很可能会被忽略,而且肯定不会做你想做的事。
你甚至不能在那个地方回报承诺。您只能在现在使用 return 语句的情况下解析承诺。您需要从 main 函数返回一个承诺,然后在现在使用 return 的事件处理程序中解析或拒绝该承诺。
有关更多信息,请参阅以下答案:
- 在 Nodejs 中返回承诺结果而不是承诺
- 从 promise 块返回函数中的值
- jQuery:在 ajax 调用成功后返回数据
使这项工作最简单的修改是将回调函数传递给extractEmail
,以便在数据准备就绪后接收数据。
var scraper = {
extractEmail: function (directoryName, cb) {
var result = getDirectory(directoryName);
if (result !== 404) {
var protocol = result.https ? https : http;
protocol.request({
host: 'somevalue.net',
method: "GET"
}, function (res) {
var data = '';
res.on('data', function (chunk) {
data += chunk;
});
res.on('end', function () {
cb(null, data);
});
})
.on('error', function (err) {
cb(err);
})
.end();
}
else {
cb(new Error('Failed'));
}
}
};
并像这样使用它:
app.get('/:directory', function (req, res) {
scraper.extractEmail(req.params.directory, function(err, n) {
if (err) return console.error(err);
console.log(n);
res.send(n);
});
});