【发布时间】: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