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