Я пытаюсь использовать переменные сеанса в экспрессе для управления входом пользователя. Я не могу заставить переменную работать над различными запросами.Вот мой код:
var config = require('config'),
ejs = require('ejs'),
util = require('util'),
express = require('express'),
bodyParser = require('body-parser'),
cors = require('cors'),
moment = require('moment'),
plaid = require('plaid'),
mariadb = require('mariadb'),
fs = require('fs'),
http = require('http'),
https = require('https'),
session = require('express-session'),
cookieParser = require('cookie-parser');
...
var app = express();
app.use(cookieParser());
app.use(
session({
resave: false,
saveUninitialized: false,
secret: 'debug',
cookie: { secure: true }
})
);
...
app.post('/tokensignin', function (req, res) {
async function verify() {
const ticket = await googleAuthClient.verifyIdToken({
idToken: req.body.idtoken,
audience: GOOGLE_AUTH_CLIENT_ID,
});
const payload = ticket.getPayload();
const userid = payload['sub'];
if (payload['aud'] == GOOGLE_AUTH_CLIENT_ID) {
pool.getConnection().then(conn => {
conn.query("CALL getUserByGoogleId(?)", [userid])
.then(rows => {
res.sendStatus(200);
if (rows[0]) {
req.session.test = "Hello, world!";
console.log("req.session.test = " + req.session.test);
req.session.user = {
firstName: rows[0].firstName,
lastName: rows[0].lastName,
avatar: rows[0].imageUrl,
};
} else {
conn
.query("CALL createUser(?,?,?,?,?)) VALUES (?,?,?,?,?)"
, [userid, req.body.firstName, req.body.lastName, req.body.imageUrl, req.body.email]
)
.then(rows => {
req.session.user = {
firstName: rows[0].firstName,
lastName: rows[0].lastName,
avatar: rows[0].imageUrl,
};
})
.catch(err => {
console.log("error: " + err);
res.send(err);
});
}
})
.catch(err => {
res.send(err);
});
conn.end();
});
}
}
verify().catch(console.error);
});
Переменные правильно сохраняются в первый раз, но когда я перенаправляю на домашнюю страницу, req.session.test
и req.session.use
не определены.
Воткод для этого:
app.all('/home', function (req, res) {
console.log("req.session.test = " + req.session.test);
console.log(req.session);
return res.render('home.ejs', {
PLAID_PUBLIC_KEY: PLAID_PUBLIC_KEY,
PLAID_ENV: PLAID_ENV,
PLAID_PRODUCTS: PLAID_PRODUCTS,
APP_MODE: config.APP_MODE,
APP_PORT: config.APP_PORT,
URL: config.URL,
test: req.session.test,
user: req.session.user,
});
});
Я использую:
- Express 4.16
- express-session 1.15.6
- cookie-parser1.4.3.
РЕДАКТИРОВАТЬ:
Мой сайт использует SSL, поэтому мой cookie
должен иметь secure:true
.
ОБНОВЛЕНИЕ:
Я попытался переместить res.sendStatus(200)
, чтобы метод теперь выглядел так:
conn.query("CALL getUserByGoogleId(?)", [userid])
.then(rows => {
if (rows[0]) {
req.session.test = "Hello, world!";
console.log("req.session.test = " + req.session.test);
req.session.user = {
firstName: rows[0].firstName,
lastName: rows[0].lastName,
avatar: rows[0].imageUrl,
};
} else {
conn.query("CALL createUser(?,?,?,?,?)) VALUES (?,?,?,?,?)"
, [userid, req.body.firstName, req.body.lastName, req.body.imageUrl, req.body.email])
.then(rows => {
req.session.user = {
firstName: rows[0].firstName,
lastName: rows[0].lastName,
avatar: rows[0].imageUrl,
};
})
.catch(err => {
console.log("error: " + err);
res.send(err);
});
}
res.sendStatus(200);
conn.end();
})
.catch(err => {
res.send(err);
});
});
и получил тот же результат.