我一直在尝试使用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”。

最佳答案

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

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

更新:

这段代码:
var test = isAuth();

将同步返回 promise ,而不会等待响应结果

如果要访问 promise 的响应,则需要使用:
test.then(value => ...);

如果您确实要发出同步的http请求(阻止您的应用程序,直到请求被解决),您可以 checkout https://github.com/ForbesLindesay/sync-request

但实际上,如果您不是仅出于测试目的,就不要使用它。

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

10-05 20:47
查看更多