使用Q.ninvoke()

时间:2016-01-11 11:55:19

标签: node.js q google-oauth2 google-api-nodejs-client google-api-js-client

我使用Google的node.js库来检索访问令牌以验证用户身份。如果我使用节点样式的回调调用以下方法,则返回tokens是一个对象,正如我在官方示例中看到的那样:

oauth2client.getToken(code, function(err, tokens) {
    console.log(tokens.access_token);
    console.log(tokens.refresh_token);
});

当我将它包装在Q.ninvoke中时(在我的应用程序中我试图在各处使用promises,出于自学原因),我得到一个数组:第一个元素是{{1} } object,第二个是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 }); 中包装标准节点函数,结果是预期的,所以我认为它可能与Google库有关,而与Q无关,idk ..

1 个答案:

答案 0 :(得分:1)

oauth2client.getToken()显然用两个以上的参数调用它的回调,在这种情况下,Q会将所有参数(err之后的参数)收集到一个传递给.then()回调的数组中(只需要一个参数)。

你可以使用.spread()再将这些分散到不同的参数中(因为你只对第一个感兴趣,你可以忽略其余的参数):

Q.ninvoke(oauth2client, "getToken", code).spread(function(tokens) {
  ...
});