节点和express中的res.json()问题

时间:2018-11-04 17:44:12

标签: node.js express

我必须实现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 :(得分:1)

罪魁祸首是此代码:

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 ,并将其字符串表示形式发送为响应正文。

答案 1 :(得分:0)

我以前也遇到过同样的问题。所有REST调用均接受单个响应。因此,在您的情况下,可能的情况是res.sendStatus(CREATED)行失败,并且当它遇到catch块时,它试图重置已发送的响应的状态标头。