SailsJS - Nodejs Https-Request。发送后无法设置标题
我是Sails.js的新手,我试图制作一个过滤器来使用来自更高服务器的承载令牌进行授权,该守护者响应OAuth2身份验证来自GitHub API。服务流效果良好。我已经意识到了Passport.js,但我试图自己实现这一点。我想出了一个policy
看起来像:SailsJS - Nodejs Https-Request。发送后无法设置标题
module.exports = function (req, res, next) {
var httpsExec = require('https');
if (req.headers.authorization) {
var parts = req.headers.authorization.split(' ');
if (parts.length == 2) {
var tokenType = parts[0]
, credentials = parts[1];
if (/^Bearer$/i.test(tokenType) || /^bearer$/i.test(tokenType)) {
httpsExec.request({
host: 'api.github.com',
post: 443,
path: '/user',
method: 'GET',
headers: {'Authorization': 'token ' + credentials, 'User-Agent': 'curly'}
}, function (response) {
var responseData = '';
response.setEncoding('utf8');
response.on('data', function (chunk) {
responseData += chunk;
});
response.once('error', function (err) {
next(err);
});
response.on('end', function() {
try {
req.options.user = JSON.parse(responseData);
next();
} catch (e) {
res.send(401, {error: e});
}
});
}).end();
} else {
console.err("The token is not a Bearer");
res.send(401)
}
}
} else {
res.send(401, {error: "Full authentication is necessary to access this resource"})
}
};
政策被调用一次我打了控制器的路线,但它抛出一个_http_outgoing.js:335 throw new Error('Can\'t set headers after they are sent.'); ^ Error: Can't set headers after they are sent.
且工艺终止。
我认为这个问题是next()
和returns
我想无论我想,把next()
电话,但还是给了我这个错误,如果我删除然后我锁定策略的要求。
编辑
我没有,我只是设置一些属性上req.options.values和发生同样的问题,政策的一个简单的示例,所以也许可能是一个问题与req.options.requestData = JSON.parse(responseData);
?我还可以如何设置一个属性发送给控制器?
response.once('error', function (err) {
next(err);
});
response.on('end', function() {
try {
req.options.user = JSON.parse(responseData);
next();
} catch (e) {
res.send(401, {error: e});
}
});
两者都正在执行。检查console.log(“something”)是否有错误,以查看是否有错误。
请接受答案 – KlwntSingh
当您尝试一起修改请求和响应或将其中一个修改为两次时,会发生这种情况。
在你的代码中,我认为回调被调用了两次,同时你也在修改响应。检查你正在调用callback“next()”的行。你会发现你的问题。
我在控制器上发现问题,而不是在策略上,因为我调用回调'next() '是在if/else或try/catch方法上进行控制器方法的开始这些行 'var artifact = req.body.artifact;' 'if(!artifact)res.badRequest({error:“ “});' 当工件不在主体上,并且必须返回错误的请求,但有时它会崩溃到异常 –
给** req.param(”key“)**一枪。 所以,如果你想获得神器,然后尝试** req.param( “神器”)**和使用它像这样 如果(req.param( “神器”)){} –
尝试从代码中删除end()。 – KlwntSingh
@ user111111111如果我删除,则抛出: '''events.js:85 throw er; //未处理'错误'事件 ^ 错误:套接字挂断 ''' –