2015-03-19 5 views
0

Я использую grunt-contrib-connect для обслуживания моего приложения в разработке и после обновления до node.js 0.12 я начал получать ошибки при попытке просмотреть мое приложение:node.js 0.12 и grunt-contrib-connect - ошибка вызова setHeader()

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, но я все еще получаю ошибку.

ответ

1

От взгляда на след, кажется, что ошибка возникает в промежуточном программном обеспечении, которое указывается для подключения, в функции allowCors. Обычно используется функция промежуточного программного обеспечения для установки заголовков доступа CORS на ответ. В рамках этой функции характерно иметь линию:

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 определяется, прежде чем пытаться установить заголовки доступа на ответ:

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'); 
}