【问题标题】:Passportjs req.logout() not working after moving to separate filePassportjs req.logout()在移动到单独的文件后不起作用
【发布时间】:2020-10-16 09:13:31
【问题描述】:

我正在使用带有 Express 的 NodeJS 作为仪表板 Web 应用程序的后端。我已经开始将后端服务器代码拆分为更小的文件(每个路由都在它自己的文件中)。我成功拆分了登录功能,但是当我拆分注销功能时,这不仅破坏了注销功能,而且还破坏了登录功能。

login.js

module.exports = function (passport) {
  const express = require('express'),
    router = express.Router();

  //Login
  router.post('/login', (req, res, next) => {
    passport.authenticate('local', (err, user, info) => {
      if (err) {
        return next(err);
      }

      if (!user) {
        return res.status(400).send([user, 'Cannot log in', info]);
      }

      req.login(user, err => {
        res.send('Logged in');
        console.log('User logged in');
      });
    })(req, res, next);
  });

  return router;
};

注销.js

module.exports = function () {
  const express = require('express'),
    router = express.Router();

  //Logout
  router.get('/logout', function (req, res) {
    req.logout();

    console.log('Logged out');

    return res.send();
  });

  return router;
};

在 index.js 中需要/使用

const loginRoute = require('./routes/login.js')(passport);
exprApp.use('/api', loginRoute);
const logoutRoute = require('./routes/logout.js');
exprApp.use('/api', logoutRoute);

logout.js 未拆分时,login.js 的工作方式与以前相同,因此我认为问题不存在。也许是因为 res.send 实际上从未以某种方式发送到前端,所以它永远不会到达 .then?有谁知道如何解决这个问题?

编辑:我在前端使用 Vue。这是处理响应的代码。它似乎永远不会到达回调,因此 router.push 等没有执行它只是挂起。

logOut: ({commit}) => {
    axios.get("/api/logout")
        .then(() => {
        router.push("/");
        commit('RESET_USER');
        commit('RESET_DEALERSHIPS');
        commit('RESET_LEADS');
    })
        .catch((errors) => {    
        console.log(errors);
    });
}

来自 logout.js 的“已注销”文本会记录到浏览器的控制台,因此端点必须存在并且前端可以访问(并且不会记录任何错误)。

【问题讨论】:

  • “打破注销功能”是什么意思?发生任何错误?
  • 通过快速测试,您不能重复使用具有相同路径的路由。多次定义/api 只会使用第一个。
  • 我在原始问题中添加了一些额外的细节。定义不同的路径已经解决了登录问题,但注销仍然无法正常工作(永远不会调用 router.push)。

标签: javascript node.js express passport.js


【解决方案1】:

我只是通过更改线路解决了这个问题

exprApp.use('/api/logout', logoutRoute);

exprApp.use('/api/logout', logoutRoute());

我不知道这为什么有效,但它解决了问题。附带说明一下,如果我将 loginRoute 更改为也使用括号,我会从 Node 收到错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-11
    • 2021-11-02
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多