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());
Комментариев нет:
Отправить комментарий