向第三方 API 请求方法的回调函数不工作
Callback function with request method to third party API is not working
我是回调概念的初学者,正在寻找解决问题的方法。
我使用 node.js 中的请求包调用第三方 API 这里是代码:
在可重复使用的库文件中:auth.js
let getAuthToken = () => {
let authToken;
var options = {
'method': 'GET',
'url': 'https://<apiURL>/V1/auth_token',
'headers': {
'Authorization': 'Basic <token>'
}
};
request(options, (error, response) => {
if (error) {
throw new Error(error);
} else {
authToken = JSON.parse(response.body);
}
});
return authToken;
}
在我的路线上:http://127.0.0.1:3000/api/v1/musics/authorize-account,我正在调用名为“getAuthorizationToken()”的控制器函数“
”
控制器文件:music.controller.js
const auth = require('../middleware/auth');
let getAuthorizationToken = async (req, res, next) => {
let token = await auth.getAuthToken();
console.log(auth.getAuthToken());
res.send(token);
}
问题是控制器功能正在完全执行,然后第三方 API 被调用事件我已将 await 添加到该功能。
请向我解释我面临的问题,任何解决方法都会非常有帮助。
您必须 return 承诺能够 await
某些东西并使其按预期工作:
let getAuthToken = () => {
let authToken;
var options = {
'method': 'GET',
'url': 'https://<apiURL>/V1/auth_token',
'headers': {
'Authorization': 'Basic <token>'
}
};
return new Promise((resolve, reject) => {
request(options, (error, response) => {
if (error) {
reject(error);
} else {
authToken = JSON.parse(response.body);
resolve(authToken);
}
});
})
}
await
仅对承诺有用。在您的情况下,您的 getAuthToken
没有 return 承诺。但是你可以改变它。
let getAuthToken = () => {
return new Promise((res, rej) => {
let authToken;
var options = {
method: "GET",
url: "https://<apiURL>/V1/auth_token",
headers: {
Authorization: "Basic <token>"
}
};
request(options, (error, response) => {
if (error) {
rej(error);
} else {
authToken = JSON.parse(response.body);
res(authToken);
}
});
});
};
此外,您还应该将 await
包装在 try / catch
中
let getAuthorizationToken = async (req, res, next) => {
try {
let token = await auth.getAuthToken();
console.log(token);
return res.send(token);
} catch(err) {
console.log(err);
return res.status(500).send(err);
}
}
您应该发送一个不同的错误代码,而不是 500 错误:
- 400 错误请求:如果缺少一些凭据,例如缺少令牌
- 401未授权:如果token错误
我是回调概念的初学者,正在寻找解决问题的方法。 我使用 node.js 中的请求包调用第三方 API 这里是代码:
在可重复使用的库文件中:auth.js
let getAuthToken = () => {
let authToken;
var options = {
'method': 'GET',
'url': 'https://<apiURL>/V1/auth_token',
'headers': {
'Authorization': 'Basic <token>'
}
};
request(options, (error, response) => {
if (error) {
throw new Error(error);
} else {
authToken = JSON.parse(response.body);
}
});
return authToken;
}
在我的路线上:http://127.0.0.1:3000/api/v1/musics/authorize-account,我正在调用名为“getAuthorizationToken()”的控制器函数“
”控制器文件:music.controller.js
const auth = require('../middleware/auth');
let getAuthorizationToken = async (req, res, next) => {
let token = await auth.getAuthToken();
console.log(auth.getAuthToken());
res.send(token);
}
问题是控制器功能正在完全执行,然后第三方 API 被调用事件我已将 await 添加到该功能。 请向我解释我面临的问题,任何解决方法都会非常有帮助。
您必须 return 承诺能够 await
某些东西并使其按预期工作:
let getAuthToken = () => {
let authToken;
var options = {
'method': 'GET',
'url': 'https://<apiURL>/V1/auth_token',
'headers': {
'Authorization': 'Basic <token>'
}
};
return new Promise((resolve, reject) => {
request(options, (error, response) => {
if (error) {
reject(error);
} else {
authToken = JSON.parse(response.body);
resolve(authToken);
}
});
})
}
await
仅对承诺有用。在您的情况下,您的 getAuthToken
没有 return 承诺。但是你可以改变它。
let getAuthToken = () => {
return new Promise((res, rej) => {
let authToken;
var options = {
method: "GET",
url: "https://<apiURL>/V1/auth_token",
headers: {
Authorization: "Basic <token>"
}
};
request(options, (error, response) => {
if (error) {
rej(error);
} else {
authToken = JSON.parse(response.body);
res(authToken);
}
});
});
};
此外,您还应该将 await
包装在 try / catch
let getAuthorizationToken = async (req, res, next) => {
try {
let token = await auth.getAuthToken();
console.log(token);
return res.send(token);
} catch(err) {
console.log(err);
return res.status(500).send(err);
}
}
您应该发送一个不同的错误代码,而不是 500 错误:
- 400 错误请求:如果缺少一些凭据,例如缺少令牌
- 401未授权:如果token错误