我必须实现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;
}
答案 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文档中读取了这些摘录后(我们不能两次发送响应):
发送 JSON响应。
将响应HTTP状态代码设置为statusCode ,并将其字符串表示形式发送为响应正文。
答案 1 :(得分:0)
我以前也遇到过同样的问题。所有REST调用均接受单个响应。因此,在您的情况下,可能的情况是res.sendStatus(CREATED)行失败,并且当它遇到catch块时,它试图重置已发送的响应的状态标头。