【问题标题】:How to turn callback function with Promise如何使用 Promise 开启回调函数
【发布时间】:2015-04-27 18:01:10
【问题描述】:

我正在使用 Bluebird Promises 并尝试通过 Promisify 工作来获得以下功能:

var jwt = require('jsonwebtoken');

function _test_encode() {
    var cert = fs.readFileSync('public.pub'); 
    return jwt.verify(token, cert, function(err, decoded) {
        console.log(decoded);
    });
}

我在下面尝试过:

var jwt = require('jsonwebtoken');
var Promise = require('bluebird');
var jwtVerifyAsync = Promise.promisify(jwt.verify);

function _test_encode() {
    var cert = fs.readFileSync('public.pub');  // get public key
    return jwtVerifyAsync(token, cert).then(function(decoded) {
        console.log(decoded);
    });
}

但我得到了:

Possibly unhandled TypeError: Object #<Object> has no method 'decode'

这里有什么我需要让它工作的东西吗? 我只想让 _test_encode 函数返回承诺的结果并在我的其他函数中使用它。

验证函数如下:

module.exports.verify = function(jwtString, secretOrPublicKey, options, callback) {
  if ((typeof options === 'function') && !callback) {
    callback = options;
    options = {};
  }

  if (!options) options = {};

  var done;

  if (callback) {
    done = function() {
      var args = Array.prototype.slice.call(arguments, 0);
      return process.nextTick(function() {
        callback.apply(null, args);
      });
    };
  } else {
    done = function(err, data) {
      if (err) throw err;
      return data;
    };
  }

  if (!jwtString){
    return done(new JsonWebTokenError('jwt must be provided'));
  }

  var parts = jwtString.split('.');

  if (parts.length !== 3){
    return done(new JsonWebTokenError('jwt malformed'));
  }

  if (parts[2].trim() === '' && secretOrPublicKey){
    return done(new JsonWebTokenError('jwt signature is required'));
  }

  var valid;

  try {
    valid = jws.verify(jwtString, secretOrPublicKey);
  } catch (e) {
    return done(e);
  }

  if (!valid)
    return done(new JsonWebTokenError('invalid signature'));

  var payload;

  try {
   payload = this.decode(jwtString);
  } catch(err) {
    return done(err);
  }

  if (typeof payload.exp !== 'undefined') {
    if (typeof payload.exp !== 'number') {
      return done(new JsonWebTokenError('invalid exp value'));
    }
    if (Math.floor(Date.now() / 1000) >= payload.exp)
      return done(new TokenExpiredError('jwt expired', new Date(payload.exp * 1000)));
  }

  if (options.audience) {
    var audiences = Array.isArray(options.audience)? options.audience : [options.audience];
    var target = Array.isArray(payload.aud) ? payload.aud : [payload.aud];

    var match = target.some(function(aud) { return audiences.indexOf(aud) != -1; });

    if (!match)
      return done(new JsonWebTokenError('jwt audience invalid. expected: ' + payload.aud));
  }

  if (options.issuer) {
    if (payload.iss !== options.issuer)
      return done(new JsonWebTokenError('jwt issuer invalid. expected: ' + payload.iss));
  }

  return done(null, payload);
};

【问题讨论】:

  • 听起来jwt.verify 没有收到正确的参数。它会抛出一个你没有捕捉到的异常。
  • @FelixKling 我刚刚更新了jwt.verifyfuncioin
  • cannot denodeify methods的可能重复

标签: javascript node.js promise bluebird


【解决方案1】:

它试图调用this.decode,但你已经通过承诺它剥离了上下文,所以this 不像它所期望的那样jwt。您可以通过将上下文作为第二个参数传递来保持上下文:

var jwtVerifyAsync = Promise.promisify(jwt.verify, jwt);

【讨论】:

    【解决方案2】:

    这是一篇较早的文章,但对于现在阅读本文的任何人,请注意您使用的是哪个版本的 Bluebird。

    从 v3.0 开始,传递给 promisify 方法的第二个参数是一个 options 对象。见here

    这段代码现在应该是:

    var jwtVerifyAsync = Promise.promisify(jwt.verify, {context: jwt})
    

    【讨论】:

      【解决方案3】:

      我只使用了jwt.verify(token, secret),没有使用promisify。它工作得很好。我想使用最新版本的 JWT 你不需要promisify

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-26
        • 1970-01-01
        相关资源
        最近更新 更多