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

时间:2015-07-13 05:15:02

标签: node.js sails.js

我是Sails.js的新手,我试图制作一个过滤器来授权使用来自更高服务器的Bearer令牌,一个看门人负责从GitHub API进行OAuth2身份验证。服务流很好。我已经知道Passport.js,但我试图自己实现这个。我带了一个policy看起来像:

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);的问题?我怎样才能设置一个属性发送给控制器?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

相关问题