проблемы в res.json () в узле и экспресс - PullRequest
0 голосов
/ 04 ноября 2018

Я должен реализовать HTTP POST запрос. У меня есть документ (id - это заголовок документа, а result1 хранит содержимое документа) в моей базе данных, который мне нужен POST. Я создал ресурс (статус 201), но мне нужно показать поле href вновь созданного ресурса на веб-странице.

Когда я пытаюсь сделать это с помощью res.json (res.json(obj.Link);). Выдает ошибку:

Error: Can't set headers after they are sent.

Мне нужна помощь в печати этого поля href.
С errorWrap () проблем нет, и маршрутизаторы уже установлены.

    function doAdd(app){
  return errorWrap(async function(req, res) {
    try {
        //fething the data
        const id = req.params.id;
        const result1 = await app.locals.finder.docContent(id);
        let obj={
            Content: result1,
            Link:[{rel : "self",
            href : baseUrl(req,DOCS)}]
        };


      // this is for posting:
      obj = req.body;
      let id1 =JSON.stringify(id); 
      let results = await app.locals.finder.addContent(id1,result1);
      // res.append("obj.Link");
      res.append('Location', baseUrl(req) + '/' + obj.id );

      res.json(obj.Link) // gives an error
      res.sendStatus(CREATED);

    }
    catch(err) {
      const mapped = mapError(err);
      res.status(mapped.status).json(mapped);
    }
  });

}
/** Return base URL of req for path.
 *  Useful for building links; Example call: baseUrl(req, DOCS)
 */
function baseUrl(req, path='/') {
  const port = req.app.locals.port;
  const url = `${req.protocol}://${req.hostname}:${port}${path}`;
  return url;
}

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Виноват этот код:

res.json(obj.Link);//response is sent here
res.sendStatus(CREATED);/* response status modified
                         * after sent and resend-attempted erroneously
                         */

Его следует изменить на (используйте res.status () ):

res.status(CREATED).json(obj.Link);

Легко понять, почему после прочтения этих выдержек из документации API (мы не можем отправить ответ дважды):

res.json ()

Отправляет ответ JSON.

res.sendStatus ()

Устанавливает код состояния HTTP ответа в значение statusCode и отправляет его строковое представление в качестве тела ответа.

0 голосов
/ 04 ноября 2018

Я сталкивался с той же проблемой и раньше. Все вызовы REST принимают один ответ. Таким образом, в вашем сценарии возможный случай может состоять в том, что строка res.sendStatus (CREATED) терпит неудачу, и когда дело доходит до перехвата блока, она пытается сбросить заголовок состояния ответа, который уже отправлен.

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