我正在尝试使用翻新从Android应用程序将商品添加到我的购物车中的商品,该商品存储在Express会话中。但是购物车数量保持不变。如何设置标题以访问快速会话?
我正在使用Nodejs开发后端的电子商务应用程序,并将购物车存储在快速会话中。至于客户端(Android应用程序),我正在使用改型来获取API数据。使用邮递员测试路线时,项目已成功添加。但是,当我尝试使用改造并通过它设置项目时,数量始终为1。我相信原因是未设置会话。
我认为没有必要在客户端上创建新的数据存储:因为会话数据存储在服务器端。但是express-session id存储在cookie中,如果我正确的话,cookies存储在客户端。如果这是错误的方法,您会提出什么建议?如果不是,我的错误是什么?
购物车模型-cart.js
module.exports = function Cart(oldCrart) {
this.items = oldCrart.items || {}; //if oldcart is not diggined use empity as default
this.totalQty = oldCrart.totalQty || 0;
this.totalPrice = oldCrart.totalPrice || 0;
this.add = function(item, id) {
var storedItem = this.items[id];
if (!storedItem) {
storedItem = this.items[id] = { item: item, qty: 0, price: 0 };
}
storedItem.qty++;
storedItem.price = storedItem.item.price * storedItem.qty;
this.totalQty++;
this.totalPrice += storedItem.item.price * 1; //*1 is there to treat the variable as intiger
};
this.generateArray = function() {
var arr = [];
for (var id in this.items) {
arr.push(this.items[id]);
}
return arr;
};
};
ProductDetails.java
compositeDisposable.add(ClientApi.addToCart(Productid, "session Id")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
new Consumer<Cart>() {
@Override
public void accept(Cart cart) throws Exception {
Toast.makeText(SingleProduct.this, "Product added to cart"), Toast.LENGTH_SHORT).show();
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Toast.makeText(SingleProduct.this,throwable.getMessage() , Toast.LENGTH_SHORT).show();
}
}));
}
Client api
@GET("/mobile-api/add-to-cart/{id}")
Observable<Cart> addToCart(@Path("id")String pid, @Header("cookie.connect.sid") String sid);
addToCart路线
//serverside
router.get("/mobile-api/add-to-cart/:id", function(req, res) {
var productId = req.params.id;
var cart = new Cart(req.session.cart ? req.session.cart : {}); //pass the cart if it exist or empity if it doesnt
console.log("cart", cart);
Product.findById(productId, function(err, product) {
if (err) {
console.log(err);
}
cart.add(product, product.id);
const totalQty = (req.session.cart = cart);
var Mycart = new Cart(req.session.cart);
const cartData = {
products: Mycart.generateArray(),
totalPrice: Mycart.totalPrice
};
console.log(cart);//LOG THE CART
res.json(cartData);
});
});
我使用邮差和android应用程序添加了四次相同的产品邮递员返回
cart Cart {
items:
{ '5c871fa5a9f2e1fc0ec63eaa': { item: [Object], qty: 4, price: 18220 } },
totalQty: 4,
totalPrice: 18220
到控制台,但返回了android应用
cart Cart {
items:
{ '5c871fa5a9f2e1fc0ec63eaa':
{ item: { manufacture: [ { _id: 5c871fa5a9f2e1fc0ec63eab, manufacturer: 'toothless' } ],
stokeamount: 3,
image: 'some-image.jpg',
price: '4555',
pname: 'Wood crafted phone case',
_id: 5c871fa5a9f2e1fc0ec63eaa },
qty: 1,
price: 4555 } },
totalQty: 1,//TOTAL QUANTITY IS ALWAYS THE SAME
totalPrice: 4555
totalQty和qty始终为1
我启用了RetrofitClient类以接受cookie,它的工作原理就像一种魅力
public class RetrofitClient {
private static Retrofit instance;
public static Retrofit getInstance(){
//create OKHTTPCLIENT
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
CookieHandler cookieHandler = new CookieManager();
OkHttpClient client = new OkHttpClient.Builder().addNetworkInterceptor(interceptor)
.cookieJar(new JavaNetCookieJar(cookieHandler))
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
if(instance == null)
instance= new Retrofit.Builder()
.baseUrl("http://192.168.44.125:5000")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
return instance;
}
}