Проблема, с которой я сталкиваюсь, заключается в том, что я не могу хранить более 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 официальная вещь, которую я должен использовать. Возможно, это волшебным образом позволит мне решить проблемы с сессией