如何防止通用路由在Express.js中的特定路由中设置标头?

时间:2017-12-29 18:44:58

标签: javascript node.js express routes http-headers

以下是Express.js中的路由定义:

// Building specific routes defined by a route file
routes.use(this.initialize.bind(this));
routes.use(this.isAuthenticated.bind(this));
routes.use(this.isAuthorized.bind(this));
if (Route.METHOD == 'POST') {
    routes.use(route.post.bind(route));
} else {
    routes.use(route.get.bind(route));
}
routes.use(this.finalize.bind(this));

router.use('/webstore/' + Route.RESOURCE + (parameters.length != 0 ? '/' : '') + parameters.join('/'), routes);

//router.use('/webstore/session', routes);

// Building generic routes
console.log('Creating GET route: ' + 
            '/:connectionName(webstore|localdatastore)/:objectName');
router.get('/:connectionName(webstore|localdatastore)/:objectName', 
    this.initialize.bind(this), this.isAuthenticated.bind(this), this.isAuthorized.bind(this), this.get.bind(this), this.finalize.bind(this));
console.log('Creating POST route: ' + 
    '/:connectionName(webstore|localdatastore)/:objectName');
router.post('/:connectionName(webstore|localdatastore)/:objectName', 
    this.initialize.bind(this), this.isAuthenticated.bind(this), this.isAuthorized.bind(this), this.get.bind(this), this.finalize.bind(this));

如果我尝试访问通用路由,例如上面两行中定义的/webstore/user,我的代码工作正常,但是,如果我尝试使用路由文件中定义的特定路由,例如{ {1}},我收到此错误:

/webstore/session

我希望我的API保持平稳,而不必添加别名来删除此错误。如何防止Express设置标头,因为通用和已定义的路径会发生冲突?

1 个答案:

答案 0 :(得分:2)

因为您正在尝试发送不可能的第二个响应。 检查以下行和它'内容。

routes.use(this.finalize.bind(this));

router.use('/webstore/' + Route.RESOURCE + (parameters.length != 0 ? '/' : '') + parameters.join('/'), routes);

基本上当你在某些路线上有这个时:

res.send("...");

您可以在其他一些中间件路由中执行此操作

res.send("....");

你得到了那个错误。

将以下代码添加到finalize方法和任何404/500错误处理程序,以防止再次发送标头。但是,如果存在会话操作,数据库调用等,代码仍在处理两个分支中的所有逻辑。

if (res.headersSent) {
    return next();
}