Google 的 oauth2client.getToken() 在使用 Q.ninvoke() 调用时不正确 returns
Google's oauth2client.getToken() incorrectly returns when called with Q.ninvoke()
我正在使用 Google 的 node.js 库来检索访问令牌以对用户进行身份验证。如果我使用节点式回调调用以下方法,返回的 tokens
是一个对象,正如我在官方示例中看到的那样:
oauth2client.getToken(code, function(err, tokens) {
console.log(tokens.access_token);
console.log(tokens.refresh_token);
});
当我将它包装在 Q.ninvoke
中时(在我的应用程序中,出于自学原因,我试图在任何地方使用 promises),我得到一个数组:第一个元素是 tokens
对象,第二个是 IncomingMessage
:
类型的对象
Q.ninvoke(oauth2client, "getToken", code).then(function(tokens) {
// Here tokens is:
//
// [ { access_token: 'XXXXXXX',
// token_type: 'Bearer',
// refresh_token: 'XXXXXXXXXXX',
// expiry_date: 1452516187132 },
// IncomingMessage {
// _readableState:
// ReadableState {
// objectMode: false,
// highWaterMark: 16384,
// buffer: [],
// length: 0,
// pipes: null,
// pipesCount: 0,
// flowing: ... ... ... ... etc
});
为什么?我错过了什么? 我尝试在 Q.ninvoke
中包装标准节点函数,结果符合预期,所以我认为它可能与 Google 库有关,与问,我知道...
oauth2client.getToken()
显然使用两个以上的参数调用其回调,在这种情况下,Q 会将所有参数(err
之后的参数)收集到一个数组中,该数组传递给 .then()
回调(只接受一个参数)。
您可以使用 .spread()
将它们再次分散到单独的参数中(并且由于您只对第一个感兴趣,您可以忽略其余部分):
Q.ninvoke(oauth2client, "getToken", code).spread(function(tokens) {
...
});
我正在使用 Google 的 node.js 库来检索访问令牌以对用户进行身份验证。如果我使用节点式回调调用以下方法,返回的 tokens
是一个对象,正如我在官方示例中看到的那样:
oauth2client.getToken(code, function(err, tokens) {
console.log(tokens.access_token);
console.log(tokens.refresh_token);
});
当我将它包装在 Q.ninvoke
中时(在我的应用程序中,出于自学原因,我试图在任何地方使用 promises),我得到一个数组:第一个元素是 tokens
对象,第二个是 IncomingMessage
:
Q.ninvoke(oauth2client, "getToken", code).then(function(tokens) {
// Here tokens is:
//
// [ { access_token: 'XXXXXXX',
// token_type: 'Bearer',
// refresh_token: 'XXXXXXXXXXX',
// expiry_date: 1452516187132 },
// IncomingMessage {
// _readableState:
// ReadableState {
// objectMode: false,
// highWaterMark: 16384,
// buffer: [],
// length: 0,
// pipes: null,
// pipesCount: 0,
// flowing: ... ... ... ... etc
});
为什么?我错过了什么? 我尝试在 Q.ninvoke
中包装标准节点函数,结果符合预期,所以我认为它可能与 Google 库有关,与问,我知道...
oauth2client.getToken()
显然使用两个以上的参数调用其回调,在这种情况下,Q 会将所有参数(err
之后的参数)收集到一个数组中,该数组传递给 .then()
回调(只接受一个参数)。
您可以使用 .spread()
将它们再次分散到单独的参数中(并且由于您只对第一个感兴趣,您可以忽略其余部分):
Q.ninvoke(oauth2client, "getToken", code).spread(function(tokens) {
...
});