Узел статического файлового сервера, как заставить ответ работать в асинхронном обратном вызове? - PullRequest
0 голосов
/ 15 октября 2018

Я написал эту функцию, которая срабатывает, когда я получаю запрос на моем сервере узлов, она отлично работает и отправляет обратно файл, который автоматически начинает загружаться.

function(req, res) {
  // … other code …

  try {
    const fileContent = fs.readFileSync(fullPath, 'utf-8');

    res.writeHead(200, {
      'Content-Type': 'text/plain',
      'Content-Disposition': `attachment; filename="${fileName}"`,
    });
    res.end(fileContent);
  } catch (err) {
    res.writeHead(404);
    res.end();
  }
}

Теперь я хочу переписать егоиспользуя метод readFile, поэтому я попробовал что-то вроде этого:

function(req, res) {
  // … other code …

  fs.readFile(fullPath, 'utf-8', function(err, data) {
    if (err) {
      res.writeHead(404);
      res.end();
      return;
    }

    res.writeHead(200, {
      'Content-Type': 'text/plain',
      'Content-Disposition': `attachment; filename="${fileName}"`,
    });
    res.end(data);
  });
}

Но теперь он всегда возвращает ошибку 404, я думаю, что функция завершается до того, как ответ готов, поэтому он отбрасывает получаемый ответпоздно?Как я могу заставить это работать?

Пожалуйста, не предлагайте использовать сторонние библиотеки, так как это не то, что я спрашиваю.Я хочу сделать это только с собственными модулями.

Заранее спасибо.

с использованием узла 10.7.0

1 Ответ

0 голосов
/ 15 октября 2018

Проблема на самом деле ранее в коде, я просто забыл вернуться внутрь оператора if:

function onRequest(req, res) {    
  // … other code …

  if (someCondition) {
    functionOfTheOriginalPost(req, res);
    return;
    // ^-- This is the return that I forgot so it 
    // was jumping down in the "404" area
  }

  res.writeHead(404);
  res.end();
}

http.createServer(onRequest).listen(3000);

Благодаря @Paul, который заставил меня задуматься и осознать ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...