Страницы

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

суббота, 11 января 2020 г.

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

#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());

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

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