一尘不染

Node.js请求返回行为异常

node.js

我有个问题。我已经在过去的3个小时中一直试图弄清楚这一点,但是我不知道为什么这没有按照我的预期工作。请知道我还是Java语言的新手,因此,如果有任何明显的内容,我深表歉意。

但是,通过此代码,我试图从Twitter获取承载令牌,return bodyconsole.log(body)返回2个完全不同的东西。

当我console.log(body)获得预期的输出时:

{"token_type":"bearer","access_token":"#####"}

但是,如果I return body,我将以JSON形式获取http请求。我在下面粘贴了我的代码,希望有人能够提供帮助。

var request = require('request');

var enc_secret = new Buffer(twit_conkey + ':' + twit_consec).toString('base64');
var oauthOptions = {
    url: 'https://api.twitter.com/oauth2/token',
    headers: {'Authorization': 'Basic ' + enc_secret, 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'},
    body: 'grant_type=client_credentials'
};

var oauth = request.post(oauthOptions, function(e, r, body) {
    return body;
});

console.log(oauth)

阅读 294

收藏
2020-07-07

共1个答案

一尘不染

异步,异步,异步。

您不能从该函数返回异步操作的结果。该函数早已在调用异步回调之前返回。因此,唯一消耗您结果的地方request.post()是在回调本身内部,并通过从该回调内部调用其他函数并将数据传递给该其他函数来进行。

var oauth = request.post(oauthOptions, function(e, r, body) {
    // use the result here
    // you cannot return it
    // the function has already returned and this callback is being called
    // by the networking infrastructure, not by your code

    // you can call your own function here and pass it the async result
    // or just insert the code here that processes the result
    processAuth(body);
});

// this line of code here is executed BEFORE the callback above is called
// so, you cannot use the async result here

仅供参考,对于新的node.js / Javascript开发人员来说,这是一个非常常见的学习问题。要在节点中进行编码,您必须学习如何使用这样的异步回调。

2020-07-07