dre*_*pel 9 node.js express reactjs express-session
我目前有一个React App(via create-react-app
)和一个Express服务器用于我的API调用.它们都是单独运行的,并且一直工作正常,直到我遇到这个问题:
我也在使用express-session
和passport
进行用户身份验证.我能够对用户进行身份验证,但会话不会在API调用之间持续存在.如果我成功登录,下次进行API调用时,req.sessionID
将会有所不同,req.isAuthenticated()
并将返回false
.
这是我的服务器代码:
'use strict'
var express = require('express');
var path = require('path');
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var mongoose = require('mongoose');
var passport = require('passport');
var session = require('express-session');
var cors = require('cors');
var flash = require('connect-flash');
var store = require('./store');
var database = require('./database');
var app = express();
var port = process.env.port || 3001;
var router = express.Router();
var promise = mongoose.connect('mongodb://localhost:27017/lifeless-db', {useMongoClient: true});
//app.use(cors());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cookieParser('lifeless-secret-01890'));
app.use(session({
secret: 'lifeless-secret-01890',
saveUninitialized: true,
cookie: {
secure: false,
}
}));
app.use(flash());
app.use(passport.initialize());
app.use(passport.session());
// Initialize Passport
var authinit = require('./auth/init');
authinit(passport);
// For debugging:
app.use(function(req, res, next) {
console.log("SessionID: " + req.sessionID);
console.log(req.isAuthenticated() ? "This user is logged in" : "This user is NOT logged in");
next();
});
// GET
app.get('/items', function(req, res) {
store.getAllItems((items) => {
if(!items) return res.send({error: true, message: 'Error loading store :/', items: null});
else return res.send({error: false, message: 'Success', items: items});
});
});
app.get('/login', function(req, res) {
console.log(req.flash());
console.log("Login fail");
res.send({error: true, message: 'Unknown error'});
});
// POST
app.post('/message', function(req, res) {
database.submitMessage(req.body.email, req.body.message, (success) => {
if (success) return res.send({error: false, message: 'Success'});
else return res.send({error: true, message: 'Error sending message'});
});
});
app.post('/login', passport.authenticate('local', {failureRedirect: '/login', failureFlash: true}), function(req, res) {
console.log(req.flash());
console.log("Login success");
return res.send({error: false, message: 'Success'});
});
// SERVER
app.listen(port, function(){
console.log('Server started.');
console.log('Listening on port ' + port);
});
Run Code Online (Sandbox Code Playgroud)
以下是来自React App(使用axios
)的API调用示例:
login(e) {
e.preventDefault();
axios({
method: 'post',
url: 'http://localhost:3001/login',
data: {
username: this.state.username,
password: this.state.password,
}
})
.then((response) => {
console.log(response.data);
if (response.data.error) {
this.setState({error: true, errmessage: response.data.message});
} else {
this.setState({redirect: true});
}
})
.catch((error) => {
this.setState({error: true, errmessage: 'Error logging in'});
});
}
Run Code Online (Sandbox Code Playgroud)
我认为必须有某种方法让React以某种方式存储会话(?)但我对React很新,并且不知道如何使用快速后端.
小智 0
以下是使用 connect-redis 设置 Express-Session 的示例。首先,设置快速会话和 Redis 存储。
var session = require('express-session);
var RedisStore = require('connect-redis')(session);
Run Code Online (Sandbox Code Playgroud)
然后,您在哪里为您的应用程序声明中间件;
app.use(session({
store: new RedisStore({
url: process.env.REDIS_URL
}),
secret: process.env.REDISSECRET,
resave: false,
saveUninitialized: false
}));
Run Code Online (Sandbox Code Playgroud)
现在,当您使用 req.session.{etc} 时,它会写入您的 Redis DB。
归档时间: |
|
查看次数: |
3456 次 |
最近记录: |