を使用connect-mongo
してexpress-session
いますが、セッション データは期待どおりに Mongo に書き込まれています。
ただし、そのコレクションに独自のフィールドを書き込むために使用するsessions
コレクションを再利用したいと思います。connect-mongo
次のような独自のセッション モデルを定義しsessions.js
ました。
const mongoose = require('mongoose');
const SessionSchema = new mongoose.Schema({
_id: {},
session: {},
expires: {},
myNewVariable: {}
});
const Sessions = mongoose.model('sessions', SessionSchema);
module.exports = {Sessions};
次に、サーバーファイルに次のものがあります。
const session = require('express-session');
const {mongoose} = require('./db/mongoose.js');
const {Sessions} = require('./models/sessions.js');
const MongoStore = require('connect-mongo')(session);
app.use(session({
secret: SECRET,
resave: true,
saveUninitialized: true,
store: new MongoStore({ mongooseConnection: mongoose.connection })
}));
app.post('/myRoute', function(req, res, next) {
Sessions.findOneAndUpdate(
{_id: req.session.id},
{$set:{myNewVariable: myNewValue}},
{new: true}).then((session) => {
console.log('session: ' + JSON.stringify(session)); // prints OK!
// Do something with the session
}).catch((e) => console.log('Something went wrong: %s', e));
});
本当に驚いたのは、上記の print ステートメントが更新されたセッション オブジェクトを実際にログに記録していることです。ただし、後でデータベースを検査すると、ドキュメントは更新されません。
また、まったく別のSessionsAlternative
コレクションを作成してみました。その場合、コレクションは正しく更新されます。それは解決策ですが、私が書こうとしているものは単一のセッション コレクションに属する必要があるため、概念的には最適ではありません。
これはまったく可能ですか?もしそうなら、私は何を間違っていますか?