【问题标题】:Nodejs Request Return MisbehavingNodejs请求返回异常
【发布时间】:2015-12-02 15:14:30
【问题描述】:

我有一个问题。在过去的 3 个小时里,我一直在试图解决这个问题,但我不知道为什么这不能像我期望的那样工作。请注意,我对 Javascript 还是很陌生,所以如果有任何明显的地方,我深表歉意。

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

当我console.log(body) 时,我得到了我期望的输出:

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

但是,如果我 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)

【问题讨论】:

    标签: javascript node.js http twitter request


    【解决方案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 开发人员来说,这是一个非常常见的学习问题。要在 node 中编码,您必须学习如何使用这样的异步回调。

    【讨论】:

    • 感谢您的评论,但我不确定如何执行此操作。我需要能够JSON.parse(body).access_token,然后将输出存储在一个变量中,这样我就可以在初始化 twitter 时调用它。如果我要将此函数与变量分离,并将变量移入内部,我将无法在函数外部调用该变量。我怎样才能做到这一点?
    • @KurisuBrooks - 异步时间完全不确定。结果可能在 1 秒内可用,也可能在 4 分钟内可用。因此,使用结果的唯一方法是在您知道它现在可用的回调中。如果你想用它来初始化 twitter,那么你可以在这个回调中调用 twitter 初始化。这似乎不是您想要的结构方式,但它是您必须使用异步结果做事的方式。
    • 我明白了,非常感谢。我试图将我的 Twitter 身份验证密钥保存在一个单独的文件中,当我同步时该文件没有提交给 git,但看起来这是不可避免的。我可能需要更多地研究异步是如何工作的,但是您一直很乐于提供帮助。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    相关资源
    最近更新 更多