如果我在 try 块中将它与 await 一起使用,请求不会给出响应?
Request is not giving response if i use it with await inside a try block?
我有一段代码,我试图从 Okta 获取对变量的响应,然后 return 将其发送给调用服务。
我正在尝试同时使用异步。但这一直在失败,就像来自 post 请求的响应永远不会到达 try 块一样。我怎样才能做到这一点?
exports.oktaLogin = async function (request) {
//const transaction = await sequelizedb.transaction();
logger.info('UserServices.oktaLogin',request);
let headers = {
'Accept': 'application/json',
'Content-Type': 'application/json'
};
let username = request.username;
let password = request.password;
let dataString = "{\"username\": \""+username+"\", \"password\": \""+password+"\", \"options\": { \"multiOptionalFactorEnroll\": true, \"warnBeforePasswordExpired\": true } }";
//console.log(dataString);
options = {
url: constants.OKTA_URL,
method: 'POST',
headers: headers,
body: dataString
};
function callback(error, response, body) {
//console.log('Called Call back');
if (!error && response.statusCode == 200) {
console.log('Inside call back');
console.log(body);
if(body){
return { success: true, user: body };
}else{
return false;
}
}else{
return { success: false, error: 'No User Found' };
}
}
try {
let some = await reqcall(options, callback);
console.log('--------------------------')
console.log(some);
} catch (error) {
return { success: false, error: 'No User Found' };
}
};
如何使回调与异步一起工作?
还有可能与 axios 一起使用吗?
和axios
,我会写类似
的东西
const axios = require('axios');
exports.oktaLogin = async (req) => {
const { username, password } = req;
const payload = {
username, password,
options: { multiOptionalFactorEnroll: true, warnBeforePasswordExpired: true }
};
try {
const res = await axios.post(constants.OKTA_URL, payload);
return {
success: true,
user: res.data
};
} catch (err) {
return {
success: false,
error: 'No User Found',
message: err.message
};
}
};
与你所拥有的相匹配,但我会做更多,例如,我不会依赖 success
但会发回一个错误,例如
const axios = require('axios');
exports.oktaLogin = async (username, password) => {
const payload = {
username, password,
options: { multiOptionalFactorEnroll: true, warnBeforePasswordExpired: true }
};
return await axios.post(constants.OKTA_URL, payload);
};
该函数现在 return 它应该是什么,并且您确切地知道该函数需要哪些参数(用户名和密码,而不是 ExpressJs 完整请求对象,因为您不需要并查看该函数签名很难理解你需要那个对象有什么)
然后我会使用 as
app.post('/login', async (req, res) => {
const { username, password } = req;
if (!isUsernameValid(username) || !isPasswordValid(username)) {
res.status(400).json({ error: 'Invalid input' });
}
try {
const login = await oktaLogin(username, password);
res.json({
user: login.data
});
} catch (err) {
res.status(400).json({ error: err.message });
}
});
其中,举个例子
const isPasswordValid = password => password.length > 8;
const isUsernameValid = username => username.length > 3;
你可以阅读更多关于 axios
的内容并创建你自己的 javascript 文件来测试它 return 的内容和它得到的内容,一个简单的文件
const axios = require('axios');
(async() => {
const HOST = 'https://jsonplaceholder.typicode.com';
const api = axios.create({
baseURL: HOST
});
// get first TODO
let res = await api.get('/todos/1');
console.log(res.status, JSON.stringify(res.data, null, 2));
// create new TODO
res = await api.post('/todos', {
title: 'test title',
body: 'test body'
});
const newId = res.data.id;
console.log(res.status, JSON.stringify(res.data, null, 2));
// delete last todo
res = await api.delete(`/todos/${newId}`);
console.log(res.status, JSON.stringify(res.data, null, 2));
})();
并尝试其他调用,例如使用 REST 服务,例如 https://jsonplaceholder.typicode.com/ 这样您就可以使用其他 HTTP 动词
和运行作为node ./index.js
(如果新文件是index.js
我有一段代码,我试图从 Okta 获取对变量的响应,然后 return 将其发送给调用服务。
我正在尝试同时使用异步。但这一直在失败,就像来自 post 请求的响应永远不会到达 try 块一样。我怎样才能做到这一点?
exports.oktaLogin = async function (request) {
//const transaction = await sequelizedb.transaction();
logger.info('UserServices.oktaLogin',request);
let headers = {
'Accept': 'application/json',
'Content-Type': 'application/json'
};
let username = request.username;
let password = request.password;
let dataString = "{\"username\": \""+username+"\", \"password\": \""+password+"\", \"options\": { \"multiOptionalFactorEnroll\": true, \"warnBeforePasswordExpired\": true } }";
//console.log(dataString);
options = {
url: constants.OKTA_URL,
method: 'POST',
headers: headers,
body: dataString
};
function callback(error, response, body) {
//console.log('Called Call back');
if (!error && response.statusCode == 200) {
console.log('Inside call back');
console.log(body);
if(body){
return { success: true, user: body };
}else{
return false;
}
}else{
return { success: false, error: 'No User Found' };
}
}
try {
let some = await reqcall(options, callback);
console.log('--------------------------')
console.log(some);
} catch (error) {
return { success: false, error: 'No User Found' };
}
};
如何使回调与异步一起工作?
还有可能与 axios 一起使用吗?
和axios
,我会写类似
const axios = require('axios');
exports.oktaLogin = async (req) => {
const { username, password } = req;
const payload = {
username, password,
options: { multiOptionalFactorEnroll: true, warnBeforePasswordExpired: true }
};
try {
const res = await axios.post(constants.OKTA_URL, payload);
return {
success: true,
user: res.data
};
} catch (err) {
return {
success: false,
error: 'No User Found',
message: err.message
};
}
};
与你所拥有的相匹配,但我会做更多,例如,我不会依赖 success
但会发回一个错误,例如
const axios = require('axios');
exports.oktaLogin = async (username, password) => {
const payload = {
username, password,
options: { multiOptionalFactorEnroll: true, warnBeforePasswordExpired: true }
};
return await axios.post(constants.OKTA_URL, payload);
};
该函数现在 return 它应该是什么,并且您确切地知道该函数需要哪些参数(用户名和密码,而不是 ExpressJs 完整请求对象,因为您不需要并查看该函数签名很难理解你需要那个对象有什么)
然后我会使用 as
app.post('/login', async (req, res) => {
const { username, password } = req;
if (!isUsernameValid(username) || !isPasswordValid(username)) {
res.status(400).json({ error: 'Invalid input' });
}
try {
const login = await oktaLogin(username, password);
res.json({
user: login.data
});
} catch (err) {
res.status(400).json({ error: err.message });
}
});
其中,举个例子
const isPasswordValid = password => password.length > 8;
const isUsernameValid = username => username.length > 3;
你可以阅读更多关于 axios
的内容并创建你自己的 javascript 文件来测试它 return 的内容和它得到的内容,一个简单的文件
const axios = require('axios');
(async() => {
const HOST = 'https://jsonplaceholder.typicode.com';
const api = axios.create({
baseURL: HOST
});
// get first TODO
let res = await api.get('/todos/1');
console.log(res.status, JSON.stringify(res.data, null, 2));
// create new TODO
res = await api.post('/todos', {
title: 'test title',
body: 'test body'
});
const newId = res.data.id;
console.log(res.status, JSON.stringify(res.data, null, 2));
// delete last todo
res = await api.delete(`/todos/${newId}`);
console.log(res.status, JSON.stringify(res.data, null, 2));
})();
并尝试其他调用,例如使用 REST 服务,例如 https://jsonplaceholder.typicode.com/ 这样您就可以使用其他 HTTP 动词
和运行作为node ./index.js
(如果新文件是index.js