Страницы

Поиск по вопросам

вторник, 5 марта 2019 г.

Вопрос по потокам в NodeJS

function sendFile(file, res) { file.pipe(res); file.pipe(process.stdout); file.on('error', (err) => { res.statusCode = 500; res.end('Server Error'); console.error(err); });
file .on('open', () => { console.log('open file'); }) .on('close', () => { console.log('close file'); });
res.on('close', () => { file.destroy(); }); }
require('http').createServer((req, res) => { const pathname = decodeURI(url.parse(req.url).pathname); switch (req.method) { case 'GET': if (pathname === '/') { const htmlFile = fs.ReadStream(path.join(__dirname, '/public/index.html')); res.setHeader('Content-Type', 'text/html;charset=utf-8'); sendFile(htmlFile, res); } res.end(); break; case 'POST': console.log('post'); break; case 'DELETE': console.log('delete'); break; default: res.statusCode = 502; res.end('Not implemented'); } }).listen(3030);
Только начал изучать NodeJS, так что сильно тапками не забрасывайте. Разбираюсь с потоками, пытаюсь передать содержимое файла index.html в ответ res.
file.pipe(res); file.pipe(process.stdout);
Второй pipe отрабатывает ожидаемо - выводит в консоль содержимое html-файла. Первый, если я правильно понимаю, должен отдавать содержимое файлика в ответ тело ответа, но в инструментах разработчика, во вкладке Network - This request has no response data available.
Подскажите, пожалуйста, где я косячу?


Ответ

Проблема в том, что на самом деле вы делаете вот так:
file.pipe(res); file.pipe(process.stdout); res.end();
Поскольку вы закрыли res - то и никаких данных он получить не успел (напоминаю, чтение из файла - операция асинхронная, pipe только планирует ее, но не ждет окончания).
Но и убирать эту строчку совсем тоже нельзя - потому что в противном случае res не будет закрыт никогда если произойдет ошибка чтения.
Вот так будет правильнее:
file.pipe(res); file.pipe(process.stdout); file.on('error', () => res.end());

Комментариев нет:

Отправить комментарий