Задать вопрос
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(); 
    })
})()
  • Вопрос задан
  • 55 просмотров
Подписаться 1 Сложный 4 комментария
Решения вопроса 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.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы