SailsJS - Nodejs Https-Request。发送后无法设置标题

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);?我还可以如何设置一个属性发送给控制器?

+0

尝试从代码中删除end()。 – KlwntSingh

+0

@ user111111111如果我删除,则抛出: '''events.js:85 throw er; //未处理'错误'事件 ^ 错误:套接字挂断 ''' –

  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”)是否有错误,以查看是否有错误。

+0

请接受答案 – KlwntSingh

当您尝试一起修改请求和响应或将其中一个修改为两次时,会发生这种情况。

在你的代码中,我认为回调被调用了两次,同时你也在修改响应。检查你正在调用callback“next()”的行。你会发现你的问题。

+0

我在控制器上发现问题,而不是在策略上,因为我调用回调'next() '是在if/else或try/catch方法上进行控制器方法的开始这些行 'var artifact = req.body.artifact;' 'if(!artifact)res.badRequest({error:“ “});' 当工件不在主体上,并且必须返回错误的请求,但有时它会崩溃到异常 –

+0

给** req.param(”key“)**一枪。 所以,如果你想获得神器,然后尝试** req.param( “神器”)**和使用它像这样 如果(req.param( “神器”)){} –