【问题标题】:Why is 'axios.get' returning a promise object?为什么'axios.get'返回一个promise对象?
【发布时间】:2017-11-11 09:37:17
【问题描述】:

我一直在尝试使用Axios 来检查用户是否经过身份验证的服务器端(Node+Express+Passport)。

如果用户通过身份验证,则服务器发回“已连接”字符串,否则,它会发回“未连接”字符串。

Router.get('/isAuth', function (req, res, next) {
    if (req.isAuthenticated()) {
        return res.status(200).send('Connected');
    } else {
        return res.status(200).send('Not connected');
    }
});

我写了一个简单的函数来检查服务器的响应:

function isAuth() {
  return axios.get('http://localhost:3000/endpoints/isAuth')
  .then((response) => {
    if (response.data === "Connected") {
      return true;
    } else {
      return false;
    }
  })
  .catch((error) => {
    console.log(error)
  })
}

如果用户已连接,该函数应该返回 true,反之亦然。

现在,当我尝试在控制台中记录函数的结果时,我得到的是:

Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
  __proto__ : Promise
  [[PromiseStatus]] : "resolved"
  [[PromiseValue]] : false

如您所见,返回的值是一个 promise 对象,而所需的输出最好是“True”或“False”。

【问题讨论】:

  • 嗯,它是“基于 Promise 的浏览器和 node.js 的 HTTP 客户端”,它返回 Promise 并不意外
  • 嗨@KyleSentient 你知道如何提取这些数据了吗?我今天遇到了同样的问题,或者你有没有找到任何替代方案?
  • @IrfandyJip 你好。老实说,我不知道我做了什么或如何做到的,但我最终设法解决了这个问题。这是我的做法,但请注意,我的项目涉及 NodeJS/Express 作为后端和 VueJS 作为前端,所以,如果你不熟悉这些,你可能会有点困惑。这是我在服务器上的处理方式:ExpressJS Backend,这是我在客户端的处理方式:VueJS Login Component

标签: node.js express axios


【解决方案1】:

isAuth 执行异步请求,这需要一些时间。因此它不能直接返回 true 或 false。相反,它将返回一个获得该布尔值的承诺。要访问您的布尔值,您必须将您的 isAuth() 函数视为一个承诺:

isAuth().then(isAuthenticated => console.log(isAuthenticated));

更新:

这段代码:

var test = isAuth();

将同步返回承诺,不会等待响应结果

如果你想访问promise的响应,你需要使用then:

test.then(value => ...);

如果你真的想做一个同步 http 请求(阻止你的应用,直到请求被解决)你可以结帐https://github.com/ForbesLindesay/sync-request

但如果不是仅用于测试目的,您实际上不想使用。

您可以考虑的另一件事是使用 node 7.6 附带的async/await,但您首先应该完全理解承诺的概念

【讨论】:

  • 感谢您的回答。我尝试了您的解决方案,尽管它返回完全相同的对象。此外,我想要做的是返回一个布尔值,而不是将结果输出到控制台。但是每当我执行返回 true 或 return false 之类的操作时,输出始终是未定义的。
  • 控制台输出只是一个关于如何访问您尝试访问的布尔值的示例。整个表达肯定仍然是一个承诺。
  • 非常感谢您的帮助。我将阅读更多有关承诺的内容,以尝试掌握它们的工作方式并消除我的一些困惑。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 2019-05-28
  • 1970-01-01
  • 2020-03-24
  • 2019-06-26
相关资源
最近更新 更多