Установить заголовки дважды и / или неправильно обрабатывать обратный вызов - в результате ошибка [ERR_HTTP_HEADERS_SENT] - PullRequest
0 голосов
/ 18 февраля 2020

Я получаю ожидаемое изображение с этим кодом, но оно не отображается в моем шаблоне pug, вместо этого оно отображается в консоли devtools браузера (надеюсь, это имеет смысл), и кажется, что я пытаюсь установить заголовки дважды. Мой код выдает [ERR_HTTP_HEADERS_SENT], как показано ниже.

Я прочитал множество вопросов StackOverflow по этому вопросу, в том числе подробное описание проблемы:

Ошибка: невозможно установить Заголовки после того, как они отправлены клиенту

, и я думаю, что на самом деле происходит то, что я неправильно обрабатываю обратный вызов, но я не уверен.

I ' мы действительно боролись с этим и могли бы немного помочь, указав, где я иду не так.

route. js:

router.get('/issue/filedisplay/:id', issue_controller.file_display);

controller. js:

// controller.js
    exports.file_display = function(req, res) {
      gfs.files.findOne(
        { _id: mongoose.Types.ObjectId(req.params.id) },
        (err, file) => {
          //res.contentType(file.contentType);
          // Check if file
          if (!file || file.length === 0) {
            return res.status(404).json({
              err: 'No file exists',
            });
          }
          const readstream = gfs.createReadStream(file._id);
          readstream.pipe(res);
          readstream.on('close', () => {
            res.render('filedisplay', {
              title: 'Display Image',
              file: file._id,
            });
          });
          //return res.json(file);
          //return res;
        }
      );
    };

Шаблон мопса:

//-filedisplay.pug
extends layout

block content
  h1= title
    p Display Image
    div
      img.image(src="/list/issue/filedisplay/" + file alt="")

Ошибка:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:482:11)
    at ServerResponse.header (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/response.js:771:10)
    at ServerResponse.send (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/response.js:170:12)
    at done (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/response.js:1008:10)
    at Object.exports.renderFile (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/pug/lib/index.js:421:12)
    at View.exports.__express [as engine] (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/pug/lib/index.js:464:11)
    at View.render (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/view.js:135:8)
    at tryRender (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/application.js:640:10)
    at Function.render (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/application.js:592:3)
    at ServerResponse.render (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/response.js:1012:7)
    at /home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/app.js:82:7
    at Layer.handle_error (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/router/layer.js:71:5)
    at trim_prefix (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/router/index.js:315:13)
    at /home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/router/index.js:335:12)
    at next (/home/don/dev/sandbox/fileupload-ex/file-upload-gridfs/node_modules/express/lib/router/index.js:275:10)

1 Ответ

0 голосов
/ 19 февраля 2020

Эта проблема закрыта. Это не решено, и код все еще сломан. Из приведенного выше кода контроллера все, что мне действительно нужно, это все до:

readstream.pipe(res);

Это работает, потому что я добавил target = "_ blank" к ссылающейся ссылке, в результате чего отображаемое изображение открывается в новом окне браузера, именно к этому я и стремился. Так что рендеринг изображения в новом шаблоне мопса был ненужным шагом, и именно эта рендеринг кода внутри метода «on» вызывал проблему.

...