Конечные точки узла перестают работать после установки cookie

#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' часть. Как только я это сделал, БУМ!! На реальном сайте все работает отлично!!