如果我在 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