【问题标题】:How to wait for API response in separate function before continuing execution?如何在继续执行之前在单独的函数中等待 API 响应?
【发布时间】:2021-11-22 13:51:38
【问题描述】:

我是 JavaScript/NodeJS 的新手,很难理解这里发生了什么。我正在编写一个函数,它将根据单独函数中的 API 发布请求的响应执行一些操作。目前,该操作只是显示有关失败或成功的消息。

以下代码(在 app.js 文件中)仅用于获取用户输入,将它们传递给 login_user 函数(在 authenticate.js 文件中),并根据 login_user 的响应显示一条消息。

const { login_user } = require('./authenticate');
// Other requirements
// App initialization

app.post('/auth', function (req, res) {
    let username = req.body.username;
    let password = req.body.password;

    let response = login_user(username, password);
    if (response == 204) {
        res.send("Success");
    } else {
        res.send("Failure");
    }
});

以下代码(在 authenticate.js 中)接受用户输入,进行 API 调用,并返回响应的状态代码。

const axios = require('axios');
const querystring = require('querystring');

function login_user(username, password) {
    var data = {
        j_username: username,
        j_password: password
    };

    axios.post("https://fakeurl.com", querystring.stringify(data))
    .then(function (response) {
        return response.status;
    })
    .catch(function (error) {
        return response.status;
    });
}

module.exports = {
    login_user
}

发生的情况是,一旦调用 login_user 函数,代码继续执行并直接进入 if/else 语句的 else 子句,总是导致失败。我想在执行 if/else 语句之前等待返回响应。

我尝试在此配置中使用 async/await...

app.post('/auth', async function (req, res) {
    let username = req.body.username;
    let password = req.body.password;

    let response = await login_user(username, password);
    if (response == 204) {
        res.send("Success");
    } else {
        res.send("Failure");
    }
});

...但没有任何运气。我做错了吗?

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    试试这个,

    const services = require('./authenticate');
    
    app.post('/auth', async function (req, res) {
        try {
            let username = req.body.username;
            let password = req.body.password;
    
            let response = await services.login_user(username, password);
    
            if (response == 204) {
                res.send("Success");
            } else {
                res.send("Failure");
            }
        } catch (e) {
            return res.status(500).json({ status: 500, message: e.message });
        }
    });
    

    还有,

    在 authenticate.js 文件中

    const axios = require('axios');
    const querystring = require('querystring');
    
    exports.login_user = async function (username, password) {
    
        try {
            let data = {
                j_username: username,
                j_password: password
            };
    
            return axios.post("https://fakeurl.com"`enter code here`, querystring.stringify(data))
                .then(function (response) {
                    return response.status;
                })
                .catch(function (error) {
                    return response.status;
                });
    
        } catch (e) {
            console.log(e);
            throw Error(`Failed to evaluate transaction: ${e}`)
        }
    }
    

    在这两个文件中使用 Async 和 await 函数调用。

    【讨论】:

      【解决方案2】:

      试试这个

       function login_user(username, password) {
              var data = {
                  j_username: username,
                  j_password: password
              };
          
              return axios.post("https://fakeurl.com", querystring.stringify(data))
              .then(function (response) {
                  return response.status;
              })
              .catch(function (error) {
                  return response.status;
              });
          }
          
          
          app.post('/auth', async function (req, res) {
              let username = req.body.username;
              let password = req.body.password;
          
              let response = await login_user(username, password);
              if (response == 204) {
                  res.send("Success");
              } else {
                  res.send("Failure");
              }
          });
      

      Axios 返回一个承诺

      有关更多信息,您可以在此处查看此答案:Returning data from Axios API

      【讨论】:

      • 更多解释您所做的更改以及为什么它对 OP 的原始解决方案有效。
      • 这个解决方案效果很好,但是正如@esqew 提到的,更多的解释会很好。 return axios.post 在这里做什么?
      • @gskn13 我已经更新了我的答案
      猜你喜欢
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 2020-01-18
      • 2014-07-12
      • 2020-01-15
      相关资源
      最近更新 更多