如何用 Promise 转回调函数
How to turn callback function with Promise
我正在使用 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 函数转换为 return promise 的结果,并在我的其他函数中使用它。
验证函数如下:
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);
};
它正在尝试调用 this.decode
,但您已经通过承诺它剥离了上下文,因此 this
并不像它预期的那样 jwt
。您可以通过将其作为第二个参数传递来通过 promisification 保持上下文:
var jwtVerifyAsync = Promise.promisify(jwt.verify, jwt);
这是较旧的 post,但对于现在阅读本文的任何人,请注意您使用的是哪个版本的 Bluebird。
从 v3.0 开始,传递给 promisify 方法的第二个参数是一个 options 对象。参见 here。
这段代码现在应该是:
var jwtVerifyAsync = Promise.promisify(jwt.verify, {context: jwt})
我只用了 jwt.verify(token, secret)
而没有 promisify
。它工作得很好。我想使用最新版本的 JWT 你不需要 promisify
.
我正在使用 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 函数转换为 return promise 的结果,并在我的其他函数中使用它。
验证函数如下:
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);
};
它正在尝试调用 this.decode
,但您已经通过承诺它剥离了上下文,因此 this
并不像它预期的那样 jwt
。您可以通过将其作为第二个参数传递来通过 promisification 保持上下文:
var jwtVerifyAsync = Promise.promisify(jwt.verify, jwt);
这是较旧的 post,但对于现在阅读本文的任何人,请注意您使用的是哪个版本的 Bluebird。
从 v3.0 开始,传递给 promisify 方法的第二个参数是一个 options 对象。参见 here。
这段代码现在应该是:
var jwtVerifyAsync = Promise.promisify(jwt.verify, {context: jwt})
我只用了 jwt.verify(token, secret)
而没有 promisify
。它工作得很好。我想使用最新版本的 JWT 你不需要 promisify
.