Express登录会话只持续一次页面视图



在下面的代码中,当我第一次访问/(未登录到FB)时,我被重定向到/login页面,如预期的那样。

然后我登录到facebook,然后我被带到/,正如预期的

如果我然后刷新页面(而在/),我收回/login页面,好像会话已经结束。

看起来每次/的新页面视图我总是被要求每次登录。

我做错了什么?

(出于测试目的,我还没有使用真正的数据库,只是为了会话的缘故设置了这个初步的user.js数据库…)

user.js

import fs from 'fs'
if (!fs.existsSync('./user.json')) {
fs.writeFileSync('./user.json', JSON.stringify(null))
}
export default {
query(facebookId) {
let user = JSON.parse(fs.readFileSync('./user.json', 'utf8'));
if (user && user.facebookId === facebookId) {
return user
}
return null
},
save(user) {
fs.writeFileSync('./user.json', JSON.stringify(user, null, 2))
return user
},
delete() {
fs.writeFileSync('./user.json', JSON.stringify(null, null, 2))
return true
}
}

server.js

import { Strategy as FacebookStrategy } from 'passport-facebook'
import express                          from 'express'
import passport                         from 'passport'
import session                          from 'express-session'
import fetch                            from 'node-fetch'
import { fileURLToPath }                from 'url'
import { dirname }                      from 'path'
import cors                             from 'cors'
import cookieParser                     from 'cookie-parser'
import { ensureLoggedIn }               from 'connect-ensure-login'
import FB                               from './fb'
import USER                             from './user'
import bodyParser                       from 'body-parser'
const jsonParser = bodyParser.json()

const {
PORT,
INSTAGRAM_USER_ID,
FACEBOOK_APP_ID,
FACEBOOK_APP_SECRET,
FACEBOOK_PAGE_NAME
} = process.env
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
const app = express()
app.use(cors({
origin: '*',
credentials: true,
optionSuccessStatus: 200
}))
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', `http://localhost:${PORT}`)
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization')
res.header('Access-Control-Allow-Methods', 'POST, GET')
next()
})
app.use(cookieParser())
app.use(bodyParser.json({limit: "50mb"}));
app.use(bodyParser.urlencoded({limit: "50mb", extended: true, parameterLimit:50000}))
app.use(session({ secret: 'googoogaga', resave: false, saveUninitialized: false }))
app.use(passport.initialize())
app.use(passport.session())
passport.use(new facebookStrategy({
clientID        : FACEBOOK_APP_ID,
clientSecret    : FACEBOOK_APP_SECRET,
callbackURL     : `http://localhost:${PORT}/facebook/callback`,
profileFields: ['id', 'displayName']
}, function(accessToken, refreshToken, profile, done) {
let user = USER.query(profile.id)
if (user) {
return done(null, user)
} else {
user = USER.save({
facebookId: profile.id,
accessToken
})
return done(null, user);
}
}));
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(user, done) {
done(null, user);
});

app.get('/auth/facebook', passport.authenticate('facebook', { scope:'email,instagram_basic,pages_show_list' }));
app.get('/facebook/callback', passport.authenticate('facebook', {
successRedirect : '/',
failureRedirect : '/login'
}));
app.get('/login', (req,res) => {
res.sendFile(__dirname + '/public/login.html');
})
app.get('/', ensureLoggedIn('/login'), (req,res) => {
res.status(200).send({ user: req.user })
})
app.get('/logout', function(req, res){
req.session.destroy(()=>{
USER.delete()
res.redirect('/login')
})
})  
app.listen(PORT)

这是因为nodemon.

每次用户登录我更新一些文件,我忘了告诉nodemon忽略这些更改,以便服务器每次由于这些文件更改而重新启动。

当服务器重启时,会话也被重置。

小心nodemon,确保将服务器要更改的文件放在文件夹中,并告诉nodemon忽略它

另一方面,服务器也可能因其他原因重新启动。为什么每次都要重置会话?没有别的办法吗?