【问题标题】:How to return the value from inner function in Nodejs如何从Nodejs中的内部函数返回值
【发布时间】:2019-05-01 06:09:00
【问题描述】:

我有 Nodejs 代码使用请求库从 url 获取身份验证令牌。

var request = require("request")

const wellish_dev_url = "https://dev.wellish.com"

function get_auth_token(){
    const  api_end_point = wellish_dev_url + "/api/v1/auth"

    var options = {
        url: api_end_point,
        headers: {"Content-Type": "application/json"},
        auth: {
            'user': 'admin',
            'pass': 'password'}
    }

    var r = request.get(options, function(error, response, body){
        if(!error && response.statusCode==200){
            var token = JSON.parse(body)
            var auth_token = token["data"][0]["accessToken"]
            // console.log(auth_token)
            return auth_token
        }
        else{
            console.log("Code : " + response.statusCode)
            console.log("error : " + error)
            console.log('body : ' + body)
        }
    })
}

// get_auth_token()
var auth_token_new = get_auth_token()
console.log(auth_token_new)  

我想返回 auth_token 以用作另一个函数的参数。但是,它显示未定义。

我在网上查找使用cb,但是,我不知道它是如何工作的。我真的很想在不使用cb 的情况下返回值。有什么帮助吗?

【问题讨论】:

标签: javascript node.js


【解决方案1】:

只有在服务器返回响应后才会执行您的回调。到那时,你的函数已经被执行了。

由于您的代码是异步的,因此您需要一种方法来仅在从服务器获取响应时才返回响应。

您可以为该任务使用Promise

这是一个关于如何在您的特定情况下解决它的示例。使用 Promise 构造函数返回一个 Promise,它在调用内部回调时解析/拒绝。

然后您只需将.then() 链接到您的函数调用即可获取令牌:

...

function get_auth_token() {
    const  api_end_point = ...
    const options = ...

    return new Promise((resolve, reject) => {
        var r = request.get(options, (error, response, body) => {
            if (!error && response.statusCode == 200){
                var token = JSON.parse(body)
                var auth_token = token["data"][0]["accessToken"]
                resolve(auth_token)
            } else {
                console.log("Code : " + response.statusCode)
                console.log("error : " + error)
                console.log('body : ' + body)
                reject(error)
            }
        })
    });
}

get_auth_token()
    .then(token => console.log(token))
    .catch(error => console.error(error));

你也可以像这样使用await从Promise中获取值,只要确保你在标记为async的函数中使用await

async function parent_function() {
    function get_auth_token() { ... }

    try {
        const token = await get_auth_token();
        console.log(token);
    } catch (error) {
        console.log(error);
    }
}

【讨论】:

  • 我是 Nodejs 的新手,我不知道我们必须使用 Promise 和回调,我只想像 python 一样返回值。有没有不使用 Promise 和回调的方法返回
  • @Akira,一旦服务器返回响应,您的回调将在稍后执行。所以代码本质上是异步的。您的函数将在来自服务器的响应到来之前完成执行,因此您需要一种方法来仅在此响应返回时执行您的代码,您可以为此使用 Promise。
  • 虽然同时使用resolvereject,但最好提供一条负责处理第二个的行,例如:get_auth_token().then(console.log).catch(console.log)get_auth_token().then(result => { console.log(result) }).catch(error => { console.log(error) }) 它们的结果是相同的在这种情况下。为避免混淆,请使用第二个示例(第一个是 OP 的进一步研究;))。
  • @Akira,看看this question - 答案描述了如何使用@jo_va 提供的示例分配promise / async/await 的结果
  • @Akira,我建议你阅读一些关于 Promise 的资料。这已经使用.thenasync/await 进行了解释,请参阅我的更新答案。
猜你喜欢
  • 1970-01-01
  • 2011-08-01
  • 2023-02-10
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多