我有使用请求库的Node.js代码来从URL获取身份验证令牌。
Vue.set
我想返回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
的情况下返回值。有帮助吗?
答案 0 :(得分:2)
仅当响应从服务器返回时,才执行您的回调。到那时,您的功能将已经执行。
由于代码是异步的,因此您需要一种仅在从服务器获得响应时才返回响应的方法。
您可以将Promise用于该任务。
这里是一个如何解决您的特殊情况的示例。使用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中获取值,只需确保在标记为await
的函数中使用async
:
async function parent_function() {
function get_auth_token() { ... }
try {
const token = await get_auth_token();
console.log(token);
} catch (error) {
console.log(error);
}
}