NodeJS http.request не возвращает данные даже после указания возврата на событие "конец"
В основном я пытаюсь отказаться от некоторых данных с веб-сайта и выполнить извлечение, удаление и обновление DOM в функции обратного вызова, привязанной к событию "end" http.request
.
Я также возвратил данные из обратного вызова события '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";
}
}
};
И вот функция Routes.js:
app.get('/:directory', function (req, res) {
var n = scraper.extractEmail(req.params.directory);
console.log(n);
res.send(n);
});
Здесь также я не получаю значение n
.
Ответы
Ответ 1
Является ли ваш "var scraper" также в файле route.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;
Ответ 2
Вы не можете вернуть значение из асинхронного обратного вызова. Ну, вы можете, но это, скорее всего, проигнорируется и, безусловно, не будет делать то, что вы хотите.
Вы даже не можете вернуть обещание в этом месте. Вы можете решить только обещание, в котором теперь используются операторы return. Вам нужно вернуть обещание от основной функции, а затем разрешить или отклонить обещание в обработчиках событий, в которых вы теперь используете возврат.
Для получения дополнительной информации см. ответы:
Ответ 3
Простейшей модификацией, которая сделает эту работу, является передача функции обратного вызова 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);
});
});