NodeJS http.request не возвращает данные даже после указания возврата в событии 'end'
В основном я пытаюсь удалить некоторые данные с веб-сайта и выполнить извлечение, удаление и обновление 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
,
3 ответа
Ваш '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;
Вы не можете вернуть значение из асинхронного обратного вызова. Ну, вы можете, но это, скорее всего, будет проигнорировано и, скорее всего, не будет делать то, что вы хотите.
Вы даже не можете вернуть обещание в этом месте. Вы можете разрешить обещание только тогда, когда вы используете операторы возврата. Вам нужно вернуть обещание из основной функции, а затем разрешить или отклонить обещание в ваших обработчиках событий, которые вы используете сейчас.
Для получения дополнительной информации см. Эти ответы:
Самая простая модификация, которая сделает эту работу, - передать функцию обратного вызова 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);
});
});