partyzanx
@partyzanx

Почему cookie-parser выдаёт некорректный куки в роутере?

index.js

const express = require('express');
const app = express();
const dotenv = require('dotenv'); 
dotenv.config();
const path = require('path'); 
const csurf = require('csurf'); 
const flash = require('connect-flash');
const mongoose = require('mongoose'); 
const session = require('express-session');
const MongoStore = require('connect-mongodb-session')(session);
const bodyParser = require('body-parser');
const methodOverride = require('method-override');
const varMiddleware = require('./middleware/variables');
const userMiddleware = require('./middleware/user');
const Char = require('./models/char');
const cookieParser = require('cookie-parser');
 
const indexRouter = require('./routes/index');
const userRouter = require('./routes/user');
const settingsRouter = require('./routes/settings');
const pencalligraphy = require('./routes/pencalligraphy');
...
app.use(cookieParser())
 ...
app.use('/', indexRouter)
app.use('/user', userRouter)
app.use('/settings', settingsRouter)
app.use('/pencalligraphy', pencalligraphy)

app.use(function (req, res, next) {
  res.status(404).render('404')
})
  start();


Вот этот роутер выдаёт некорректный куки постоянно
Либо по началу выдаёт нормально, а потом некорректно. Хотя в браузере всё корректно передаётся.
./routes/pencalligraphy

const express = require('express');
const router = express.Router();
const Char = require('../models/char');

router.get('/', paginatedResults(Char), async (req, res) => {
    let lang = req.cookies.lang;  
    console.log(req.cookies);
    res.render('pencalligraphy', {
        pageTitle: 'Basic Characters',
        sessionUser: req.session.user,
        bChars: res.paginatedResults,
        lang
    });
})
router.get('/:id', async (req, res) => { 
    let lang = req.cookies.lang; 
    console.log(req.cookies);
    let char = await Char.find({char: req.params.id});
    char = char[0];
    console.log(char);
    res.render('pencalligraphy_char', {
        pageTitle: 'Basic Characters',
        sessionUser: req.session.user,
        char,
        lang
    });
})
 
...

module.exports = router;


А, например, с этим всё впорядке.
'./routes/index'
const express = require('express');
const router = express.Router();

router.get('/', async (req, res) => {
    let lang = req.cookies.lang;  
    console.log(req.cookies);
    res.render('index', {
        pageTitle: 'Home',
        sessionUser: req.session.user,
        lang
    });
})

module.exports = router;


Код, который ставит куки.
(function languageSwitcher() {
    let div = document.getElementById('languageSwitcher');
    let browserLang = window.navigator.language || 'en';
    let currentBrowserLang = /ru/.test(browserLang) ? 'Russian' : 'English'
    if (!localStorage.lang) {
        div.textContent = /ru/.test(browserLang) ? 'English' : 'Russian'
        } else {
        div.textContent = localStorage.lang === 'R' ? 'English' : 'Russian'
        }
    if (!localStorage.notFirstVisit) {
        document.cookie = `lang=${currentBrowserLang[0]}`;
        localStorage.notFirstVisit = true;
        window.location.reload(false); 
    }
    div.addEventListener('click', (e) => {
        localStorage.lang = e.target.textContent[0]
        document.cookie = `lang=${e.target.textContent[0]}`; 
        window.location.reload(false); 
    })

    document.querySelector('.languageSwitcher_Flag').addEventListener('click', () => {
        div.click(); 
    })
})()
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
Когда вы ставите куку так:
document.cookie = 'name=value';
она выставляется для текущего пути. Т.е. если этот код выполняется на странице /pencalligraphy, то кука будет выставлена для этой и вложенных страниц (например, /pencalligraphy/about), но не для корневой страницы или соседних страниц.

Что бы поставить куку для всего сайта, нужно явно указать путь для которого эта кука выставляется. Вот так:
document.cookie = 'name=value; path=/';

Документация: https://developer.mozilla.org/en-US/docs/Web/API/D...


document.cookie = newCookie;
[...]
;path=path (e.g., '/', '/mydir') If not specified, defaults to the current path of the current document location.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
17 мая 2024, в 12:41
10000 руб./за проект
17 мая 2024, в 12:40
30000 руб./за проект
17 мая 2024, в 12:22
350 руб./за проект