【发布时间】:2017-12-29 11:41:51
【问题描述】:
我找到了this 的帖子,它解释了在调用toObject 和toJSON 方法时如何保留虚拟字段。但是,我的问题是我正在尝试使用 Passport.js 本地策略设置的 req.user 对象,这(显然)不是 Mongoose 模型。
我有一个 User 架构来存储名字和姓氏,并且我使用虚拟属性 name.full 来调用全名,中间有一个空格。我不必为此使用虚拟,不,但我真的很想。
const schema = new Schema({
name: {
first: "john",
last: "smith"
}
})
.virtual("name.full")
.get(function () {
return this.name.first + " " + this.name.last;
});
module.exports = mongoose.model("User", schema);
现在,我有一个指向/login 的路由器,用户可以在其中发布他/她的登录信息,Passport.js 将使用本地策略进行身份验证。
用户通过身份验证后,我使用 Passport.js 自动设置的 req.user 对象将用户信息保存在 Express.js 会话中。
function redirectToHome (req, res) {
req.session.contextVars = { user: req.user };
res.redirect("/home");
}
所以整个后路由器看起来像:
router.post("/login", passport.authenticate("local", { failureRedirect: "login" }), redirectToHome);
这里的问题是,尽管 req.user 是一个对象,它可以做 Mongoose 模型可以做的所有事情——甚至调用实例方法——但它没有任何虚拟字段。我设置了toObject: { virtuals: true } 和toJSON: { virtuals: true },就像前面提到的帖子中所建议的那样,因为我认为 Passport.js 在将数据存储到会话对象中之前可能会在后台调用两者之一,但似乎并非如此。
我正在使用express-session 和 passport.session() 进行会话管理。
app.js
const express = require("express")
, app = express();
const session = require("express-session");
const passport = require("passport");
app.use(session({
secret: "secret key",
saveUninitialized: true,
resave: true
}));
app.use(passport.initialize())
.use(passport.session());
我正在尝试在pug 文件中读取此数据,该文件以Object 到res.render 的形式接收数据。
routes/index.js
router.get("/home", function (req, res) {
res.render("home", { LOCAL_DATA: req.session.contextVars });
});
home.pug
... usual head stuff
body
p #{JSON.stringify(LOCAL_DATA.user)}
我可以想到一些解决方法,但我想以这种特定方式解决问题。有谁知道如何确保 Passport.js 为 req.user 对象分配了所有可见的虚拟字段?
谢谢。
【问题讨论】:
-
没有持久性,因为代码在猫鼬模型中显示了它。如果我正确理解了您的查询,则您错过了对模式对象上 save 方法的调用。请参考我的回答。
标签: node.js mongoose passport.js passport-local