我在任何路由上向我的服务器发送POST请求。它将数据正确地存储在数据库中,并返回没有错误的响应。
但是,如果我向同一路线发送另一个POST请求,请使用正确的&不同的POST信息,它将工作,数据将存储在数据库和&返回将是正确的,但它将触发异常:
EntityAlreadyExistsException, mongoose _id: 5ad5e661f2b3935b5b485890 already exists
然后是:
Error: Can't set headers after they are sent.
似乎即使响应已在第一个POST请求中成功发送回客户端,数据仍以某种方式保留在API中。
以下是回复代码:
public static Respond(res: any, errorKey: string, data: any) {
if (errorKey && errorKey.length != 0) {
let error = new Error(errorKey);
res.status(error.HTTPCode).json(error.ToObject());
} else {
res.status(200).json({ data: data });
}
}
如果第三次发送POST请求,则错误如下:
Error: Can't set headers after they are sent.
EntityAlreadyExistsException mongoose _id: 5ad5e661f2b3935b5b485890 already exists
Error: Can't set headers after they are sent.
EntityAlreadyExistsException mongoose _id: 5ad5e661f2b3935b5b485890 already exists
Success
发送第三个POST请求时,上述内容将重复三次。 奇怪的是,除了控制台中的这些消息之外,应用程序正常工作(正确存储数据并发送正确的响应)。 POST请求通过Postman发送。
这里有一个类似的问题:Can't set headers after they are sent. on second call to REST API using Node and express
但是,在这种情况下,该解决方案不起作用。
路由文件:
public static Start(app: any, config: any) {
/* Open Routes */
UserRoutes.StartOpenRoutes(Routes.router, config);
/* End Of Open Routes */
Routes.router.use((req, res, next) => { Authenticator.Verify(req, res, next, config); });
/* Closed Routes */
app.use("/", Routes.router);
ContainerRoutes.StartClosedRoutes(Routes.router, config);
PredictionRoutes.StartClosedRoutes(Routes.router, config);
TradeRoutes.StartClosedRoutes(Routes.router, config);
UserRoutes.StartClosedRoutes(Routes.router, config);
app.use((req: any, res: any) => {
Response.Respond(res, "undefined_route", null);
});
}
以下是贸易路线(TradeRoutes):
public static StartClosedRoutes(router: express.Router, config: any) {
router.post('/trades', (req, res, next) => { Validator.Validate(req, res, next, 'POST /trades'); }
, (req, res, next) => { Authorizer.CheckPermission(req, res, next, Actions.ADD_TRADE); }
, (req, res, next) => { TradeModule.Post(req, res, next, config); });
router.put('/trades/:id', (req, res, next) => { Validator.Validate(req, res, next, 'PUT /trades'); }
, (req, res, next) => { Authorizer.CheckPermission(req, res, next, Actions.UPDATE_TRADE); }
, (req, res, next) => { TradeModule.Put(req, res, next, config); });
router.get('/trades/:id', (req, res, next) => { Authorizer.CheckPermission(req, res, next, Actions.GET_TRADE); }
, (req, res, next) => { TradeModule.Get(req, res, next, config); });
router.get('/trades', (req, res, next) => { Authorizer.CheckPermission(req, res, next, Actions.GET_TRADE); }, (req, res, next) => { TradeModule.Index(req, res, next, config); });
router.delete('/trades/:id', (req, res, next) => { Authorizer.CheckPermission(req, res, next, Actions.DELETE_TRADE); }
, (req, res, next) => { TradeModule.Delete(req, res, next, config); });
}
答案 0 :(得分:0)
此问题是由于未清除mongoose collectionChange boolean。
引起的每当更新/删除mongo数据库中的集合时,名为tradeChange的集合的内部属性将设置为true,因此当调用内部方法SubmitChanges时,它将检查是否有任何集合需要CRUD操作。
在不重置值的情况下,mongoose值会传播到下一个调用,依此类推。