На данный вопрос уже ответили:
Если request поместить в app.get, то всегда будет возвращаться пустая страница, а если поместить request перед app.get то значение будет отправлено клиенту.
Вопрос: как заставить app.get подождать пока request сделает свою работу и лишь тогда отправлять данные?
var express = require('express');
var cheerio = require('cheerio');
var request = require('request');
var app = express();
var text;
var headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'
};
var options = {
url:'http://www.worldtimeserver.com/',
headers:headers
};
request(options,function(err,res,body) {
$ = cheerio.load(body);
text=( $('h1').text() );
});
app.get('/', function (req, res) {
res.send(text);
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
Немного магии:
var express = require('express'),
cheerio = require('cheerio'),
request = require('request'),
events = require('events'); // Это встроенный модуль
var app = express();
var text;
text_state = new events.EventEmitter; // Нам понадобится событие "текст загружен"
var headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'
};
var options = {
url:'http://www.worldtimeserver.com/',
headers:headers
};
request(options,function(err,res,body) {
$ = cheerio.load(body);
text=$('h1').text();
text_state.emit('ready'); // Вызываем событие загрузки
});
app.get('/', function (req, res) {
if(text){ // если текст еще не загружен - то он undefined, так что мы идём и ждем события загрузки
res.send(text);
}else{
text_state.on('ready',() => {
res.send(text);
});
}
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
А если засунуть request (вместе с options и headers) в обработчик app.get (перед res.send) разве он не будет именно так и делать?
P.S. Попробовал с промисом, конечно, чисто для интересу:
var express = require('express'),
cheerio = require('cheerio'),
request = require('request');
var app = express();
var text;
var headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36'
};
var options = {
url:'http://www.worldtimeserver.com/',
headers:headers
};
request(options,function(err,res,body) {
$ = cheerio.load(body);
text=$('h1').text();
});
app.get('/', function (req, res) {
new Promise(function(resolve) {
resolve(text);
}).then(text => res.send(text));
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
Только лень въезжать, как блок скрипта вставить. Объяснил бы кто, что ли.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники