Как Next. js влияет на сеансы и почему я не могу добавить более 2 товаров в корзину, используя сеанс - PullRequest
1 голос
/ 27 апреля 2020

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу хранить более 2 товаров в корзине, которая находится в сеансе. Я знаю, как добавить элементы в корзину с помощью сеанса, используя req.session.cart.push, похоже, у меня возникают проблемы только с использованием Next. js. Я надеялся, что кто-то может сказать мне, если Next. js сеансы эффекта. У меня есть код большего размера, но я сделал очень простой c тест, который я вам покажу.

server.post("/addToCart", async (req, res) => {
    try {
        console.log("/addToCart", req.body);
        var  product  = req.body.name;
        // var cart = req.session.cart;
        // console.log("cart", cart)
        console.log("id at Top", req.session.id)

        if(req.session.cart){
            console.log("IN TOP IF")
            console.log("cartLengthTOP", req.session.cart.length)
            req.session.cart.push(product)
            // req.session.cart += ` ${product} `
            console.log("cartLengthBottom", req.session.cart)
            // console.log("cartLengthBottom", req.session.cart.length)
        }else{
            console.log("IN ELSE")
            // req.session.cart = product
            req.session.cart = [product]
        }
        return res.send({ status: "success", cart: req.session.cart });

    } catch (e) {
        console.log("E", e)
        return res.send({ status: "fail", message: "Server error" })
    }
})

Я проверил его, нажав на кнопку «добавить в корзину» на 3 товарах. Когда я нажимаю на третий продукт, в корзине только товары 1 и 3, но в корзине должно быть все 3 товара.

Вот верхняя часть кода, которая показывает настройки сеанса.

app.prepare().then(()=>{
async function isAuth(req, res, next) {
    if (req.user) {
        return next();
    } else {
        res.send("Need To be authorized")
        return next()
    }
}

mongoose.connect(connectionString, { useNewUrlParser: true }, function (err) {
    if (err) console.log("err", err);
    console.log("db connected")

const conn = mongoose.connection;
const server = express();
server.use(express.json());
const session = require('express-session')
const MongoStore = require("connect-mongo")(session)

server.use(session({
    secret: 'a;ldfnrlkfe5332',
    resave: true,
    store: new MongoStore({ mongooseConnection: mongoose.connection }),
    saveUninitialized: false,
    cookie : {secure : false}
}));
server.use(passport.initialize());
server.use(passport.session());
passport.serializeUser(function (user, done) {
    console.log("serialize", user.id)
    done(null, user.id);
});
// used to deserialize the user
passport.deserializeUser(function (id, done) {
    User.findById(id, function (err, user) {
        done(err, user.toObject());
    });
});
// const server = express();

Я обычно использую axios для всего, поэтому я решил использовать fetch, потому что, возможно, это была проблема с топором ios, но это не помогло.

    fetch('/addToCart', {
        method: 'POST', // *GET, POST, PUT, DELETE, etc.
        mode: 'cors', // no-cors, *cors, same-origin
        cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
        credentials: 'same-origin', // include, *same-origin, omit
        headers: {
            'Content-Type': 'application/json'
        },
        redirect: 'follow', // manual, *follow, error
        referrerPolicy: 'no-referrer', // no-referrer, *client
        body: JSON.stringify(product)
    })
        .then((response) => {
            // Do stuff with the response
            console.log("response",response)
        })
        .catch((error) => {
            console.log('Looks like there was a problem: \n', error);
        });

Редактировать

Я играл с этим. Я заметил, что могу несколько раз добавлять товар в массив, когда нажимаю кнопку на странице. Но если я нажимаю несколько раз на втором продукте, затем нажимаю один раз на третьем продукте, все вторые элементы продукта, которые были помещены в массив, удаляются, и третий элемент становится вторым элементом. Я могу продолжать нажимать кнопку для продукта 3, и несколько из них будут добавлены, но когда я нажимаю на продукт 2, все 3-ий элементы забираются.

FYI Продукты находятся на разных страницах.

Извините, что сделал это редактирование

Теперь я вижу, что sessionId отличается каждый раз, когда я нажимаю на кнопку на другой странице. Я использую cookie : {secure : false} Это исправлено для меня в прошлый раз. Также, когда я go на вкладке приложения в chrome адвокат, я не вижу никаких сеансов или готовлю данные ie. Не уверен, если я должен

Редактировать. это https://www.npmjs.com/package/next-session официальная вещь, которую я должен использовать. Возможно, это волшебным образом позволит мне решить проблемы с сессией

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...