node.js 0.12 和 grunt-contrib-connect - 调用 setHeader() 时出错

node.js 0.12 and grunt-contrib-connect - error calling setHeader()

我在开发中使用 grunt-contrib-connect 为我的应用程序提供服务,在升级到 node.js 0.12 后,我在尝试浏览我的应用程序时开始遇到错误:

Error: "name" and "value" are required for setHeader().
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:333:11)
at ServerResponse.res.setHeader (/Users/abc/app/node_modules/grunt-contrib-connect/node_modules/connect/lib/patch.js:59:22)
at Object.module.exports.grunt.config.options.middleware.allowCors [as handle] (/Users/abc/app/grunt_tasks/connect.js:24:29)
at next (/Users/abc/app/node_modules/grunt-contrib-connect/node_modules/connect/lib/proto.js:190:15)
at Object.module.exports [as handle] (/Users/abc/app/node_modules/grunt-contrib-connect/node_modules/connect-livereload/index.js:84:5)
at next (/Users/abc/app/node_modules/grunt-contrib-connect/node_modules/connect/lib/proto.js:190:15)
at Function.app.handle (/Users/abc/app/node_modules/grunt-contrib-connect/node_modules/connect/lib/proto.js:198:3)
at Server.app (/Users/abc/app/node_modules/grunt-contrib-connect/node_modules/connect/lib/connect.js:65:37)
at Server.emit (events.js:110:17)
at HTTPParser.parserOnIncoming [as onIncoming] (_http_server.js:491:12)

除了升级节点外没有其他变化。我尝试更新到最新版本的 grunt-contrib-connect,但我仍然收到错误。

从跟踪来看,似乎错误发生在指定要连接的中间件中,在函数 allowCors 中。通常指定一个中间件函数来在响应中设置 CORS 访问 headers。作为此功能的一部分,通常有以下行:

res.setHeader('Access-Control-Allow-Origin', req.headers.origin);

从节点 0.12 开始,将在 req.headers.origin 未定义的请求上抛出此错误。

似乎在 0.12 中进行了更改,要求该值存在,而以前它可能是未定义的。查看变化:https://github.com/joyent/node/commit/979d0ca874df0383311ca06f154f6965074196ee

使用 0.12 时,在指定此中间件功能时,一个选项是简单地添加一个检查以查看是否定义了 req.headers.origin,然后再尝试对响应设置访问权限 headers:

if (req.headers.origin) {
    res.setHeader('Access-Control-Allow-Credentials', true);
    res.setHeader('Access-Control-Allow-Origin', req.headers.origin);
    res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.setHeader('Access-Control-Allow-Headers', 'X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version');
}