我使用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 ..
答案 0 :(得分:1)
oauth2client.getToken()
显然用两个以上的参数调用它的回调,在这种情况下,Q会将所有参数(err
之后的参数)收集到一个传递给.then()
回调的数组中(只需要一个参数)。
你可以使用.spread()
再将这些分散到不同的参数中(因为你只对第一个感兴趣,你可以忽略其余的参数):
Q.ninvoke(oauth2client, "getToken", code).spread(function(tokens) {
...
});