Express.js - 第二次POST请求:发送后无法设置标头

时间:2018-04-17 12:50:26

标签: node.js express mongoose

我在任何路由上向我的服务器发送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); });
}

1 个答案:

答案 0 :(得分:0)

此问题是由于未清除mongoose collectionChange boolean。

引起的

每当更新/删除mongo数据库中的集合时,名为tradeChange的集合的内部属性将设置为true,因此当调用内部方法SubmitChanges时,它将检查是否有任何集合需要CRUD操作。

在不重置值的情况下,mongoose值会传播到下一个调用,依此类推。