#node.js #express #cookies
#node.js #экспресс #файлы cookie
Вопрос:
Я уже некоторое время борюсь с этой проблемой. Во-первых, все отлично работает на моем локальном компьютере, что затрудняет тестирование. Когда я загружаю сайт на наш общедоступный сайт, он ломается. Я могу войти в систему просто отлично и получить cookie. Но после этого все мои конечные точки перестают работать. Вкладка Сеть ничего не показывает для запроса или ответа для них. Я тестировал с Postman. Я могу просто поразить все конечные точки, пока не войду в систему и не получу cookie. Тогда я больше не могу нажимать на эти конечные точки, он просто вращается. Если я удалю файл cookie, я смогу снова поразить их. Так что это должно быть что-то с тем, как я устанавливаю cookie или проверяю cookie на моем узловом сервере.
Вот мой основной app.js Файл сервера узла. Если потребуются какие-либо другие файлы, дайте мне знать.
const createError = require('http-errors');
const express = require('express');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const passport = require('passport');
const session = require('express-session');
const flash = require('connect-flash');
const cors = require('cors');
const MySQLStore = require('express-mysql-session')(session);
const config = require('./config/config');
// MySql Store setup
const options = {
host: config.host,
port: config.port,
user: config.username,
password: config.password,
database: config.database
};
const sessionStore = new MySQLStore(options);
const app = express();
// Middleware
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser(config.session_secret));
app.use(cors());
app.options('*', cors());
// app.use(function(req, res, next) {
// res.header('Access-Control-Allow-Origin', '*');
// res.header(
// 'Access-Control-Allow-Headers',
// 'Origin, X-Requested-With, Content-Type, Accept'
// );
//
// next();
// });
//
// app.use(function(req, res, next) {
// res.setHeader('Access-Control-Allow-Origin', '*');
// res.setHeader(
// 'Access-Control-Allow-Methods',
// 'GET, POST, PUT, DELETE'
// );
// res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
// res.setHeader('Access-Control-Allow-Credentials', true);
// next();
// });
// session setup
app.set('trust proxy', 1); // trust first proxy
app.use(
session({
secret: config.session_secret,
resave: false,
saveUninitialized: false,
store: sessionStore,
name: 'reg-portal-cid',
cookie: {
secure: false,
httpOnly: false,
maxAge: 1000 * 60 * 60 * 24 * 365
}
})
);
app.use(flash());
require('./API_Gateways/passport')(passport);
// passport authentication
app.use(passport.initialize());
app.use(passport.session());
// user identification
app.use(require('./middleware/user_identification'));
app.use('/auth', require('./API_Gateways/Auth_Routes'));
// Application Gateways
// app.use('/api', function(req, res) {
// return res
// .status(200)
// .json({ message: 'Success! Base API endpoint.' });
// });
app.use('/users', require('./API_Gateways/User_Gateway'));
app.use('/customers', require('./API_Gateways/Customer_Gateway'));
app.use('/SDS', require('./API_Gateways/SDS_Gateway'));
app.use('/chemicals', require('./API_Gateways/Chemical_Gateway'));
app.use('/PDF', require('./API_Gateways/PDF_Gateway'));
app.get('/', (req, res) => {
return res
.status(200)
.send(
'<h1>This is the Node server for the Registration Portal.</h1>'
);
});
// Logout Route
app.post('/logout', (req, res) => {
console.log('app logout route');
sessionStore.destroy(req.sessionID, (err) => console.log(err));
req.logout();
req.session.destroy();
res.clearCookie('reg-portal-cid');
// res.clearCookie('connect.sid');
return res.status(200).json({ message: 'User Logged Out' });
});
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
});
process
.on('unhandledRejection', (reason, p) => {
console.error(reason, 'Unhandled Rejection at Promise', p);
})
.on('uncaughtException', (err) => {
console.error(err, 'Uncaught Exception thrown');
//process.exit(1);
});
module.exports = app;
Кроме того, если это вообще помогает, после того, как я вошел в систему с помощью Postman и получил cookie, я нажимаю на маршрут выхода, и он просто сидит там и вращается. Когда я нажимаю «Отмена» в Postman, выводится терминал моего сервера узла POST /logout - - ms - -
, который сообщает мне, что он получает какой-то удар.
Ответ №1:
Проблема, по-видимому, связана с кэшированием в браузере, поскольку на вкладке сеть браузера нет запросов.
Чтобы исключить это, вы можете попробовать открыть сайт на вкладке инкогнито и попробовать?
Комментарии:
1. Хорошая мысль, но та же проблема возникает и в режиме инкогнито.
Ответ №2:
Попробуйте добавить хранилище памяти, это сработало для меня
var MemoryStore = require('memorystore')(session)
app.use(session({
cookie: { maxAge: 86400000 },
store: new MemoryStore({
checkPeriod: 86400000 // prune expired entries every 24h
}),
resave: false,
secret: 'keyboard cat'
}))```
Ответ №3:
Я разобрался с проблемой. Это было не то, что кто-либо понял бы из моего вопроса или из моего кода. Так что, скорее всего, этот вопрос и ответ никому не будут полезны в будущем. И найти его было очень трудно, как иголку в стоге сена. Я выяснил, что сеанс не сохранялся в базе данных на нашем реальном сайте, но он был на localhost.
Итак, я начал разбираться, почему, и начал специально изучать express-mysql-session
пакет. Я понял, что есть способ запустить его в режиме отладки, и как только я это сделал, я сразу увидел ошибки в терминале, говорящие, что он не может сохраниться в базе данных. Итак, я знал, что я на правильном пути. Я просмотрел конкретную ошибку, о которой я получал ER_NOT_SUPPORTED_AUTH_MODE
, и это привело меня к этой теме проблем на Github: https://github.com/chill117/express-mysql-session/issues/109 А затем я нашел ответ twentythreetea для запуска этих 2 запросов Mysql:
ALTER USER 'YOUR USERNAME'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YOUR PASSWORD'
flush privileges;
Я использовал MySQL Workbench и понял, что мне нужно удалить @'localhost'
часть. Как только я это сделал, БУМ!! На реальном сайте все работает отлично!!