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) {
  ...
});