Express.jsでアプリを作成しています。初めてサイトに訪れたときに匿名ユーザーを自動で作成してクッキーに保存するために以下のミドルウェアを作りました。
JavaScript
1const User = require('../models/user'); 2 3const createAnonymUser = async (req, res, next) => { 4 if (!req.cookies.anonymUser && !req.user) { 5 const anonymUser = await User.create({ username: 'anonymous', displayName: '名無しさん' }); 6 res.cookie('anonymUser', anonymUser); 7 return next(); 8 } 9 next(); 10}; 11 12module.exports = createAnonymUser; 13
このミドルウェアをすべてのルーティングに優先させて実行したいのですが、現状匿名ユーザーが作成されるよりも先に他のルーティングが実行されてしまう結果、匿名ユーザーのプロパティを取得できずエラーが発生してしまいます。リロードするとエラーは消えます。
ルーティングの設定は以下のようになっています。Expressは上から順にルーティングを実行していくと聞いたことがあり、ミドルウェアを一番上に置いているのですが、なぜうまく行かないのでしょうか?
JavaScript
1// router setup 2app.use(createAnonymUser); 3app.use(indexRouter); 4app.use('/questions', questionsRouter); 5app.use('/oauth2', oauth2Router); 6app.use('/comments', commentsRouter); 7app.use('/users', usersRouter);
###追記
実行例①
JavaScript
1const createAnonymUser = (req, res, next) => { 2 console.log('createAnonymUser'); 3 if (!req.cookies.anonymUser && !req.user) { 4 const anonymUser = (async () => await User.create({ username: 'anonymous', displayName: '名無しさん' }))(); 5 console.log(anonymUser); 6 res.cookie('anonymUser', anonymUser); 7 return next(); 8 } 9 next(); 10};
実行例②
JavaScript
1const createAnonymUser = (req, res, next) => { 2 console.log('createAnonymUser'); 3 if (!req.cookies.anonymUser && !req.user) { 4 (async () => { 5 const anonymUser = new User({ username: 'anonymous', displayName: '名無しさん' }); 6 await anonymUser.save(); 7 res.cookie('anonymUser', anonymUser); 8 console.log(anonymUser); 9 return next(); 10 })(); 11 } else { 12 next(); 13 } 14};
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。