我正在创建一个电子商务网站,将所有数据存储在数据库和会话存储中。对于已登录的用户,只有登录凭据存储在会话存储中。因此,每当网站第一次运行时,应该从我们从会话存储中获得的数据中从数据库中获取数据,但是如果我为此目的使用中间件,则效率不高,因为中间件在每个请求上都运行。那么,有没有办法解决这个问题,或者有没有更好的解决方案更有效?此外,您可能想知道为什么我不直接将数据存储在会话存储中。所以,问题是,当我从会话存储中获取数据时,它不是以猫鼬模型的形式返回的,所以我必须调用数据库一次。我使用 mongo store、express、node 和 ejs。
这是我在索引文件中使用的中间件,用于在登录期间使用存储在会话存储中的 id 从 mongoose 模型中的数据库中获取数据。
app.use(async (req, res, next) => {
try {
if(req.session.userid) {
req.user = await user.findById(userid)
}
} catch(err) {
res.redirect('/' + req.oldUrl + '?err=UserNotFound')
}
next()
})
app.use(session({
secret: 'secret',
saveUninitialized: false,
resave: false,
cookie: {
maxAge: 1000 * 60 * 60 * 24 * 365 * 100,
secure: false
},
store: store
}))
这是我的猫鼬模型
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const userschema = new Schema({
Name : {
type : String,
required : true
},
Email : {
type : String,
required : true
},
Password : {
type : String,
required : true
},
IsSeller : {
type : Boolean,
defualt : false
},
Shopname : {
Type : String,
default : "-"
},
Cart : {
Items : [
{
productId : {
type : Schema.Types.ObjectId,
ref : 'product',
required : true
},
quantity : {
type : Number,
required : true
}
}
]
},
Myproducts : {
items : [
{
productId : {
type : Schema.Types.ObjectId,
ref : 'product',
required : true
},
quantity : {
type : Number,
required : true
}
}
]
},
Sdate : {
type : String,
default : "-"
}
})
module.exports = mongoose.model('user', userschema)