Идентификатор на Node.js и Mongodb
Я заменю базу данных с Mysql на Mongodb и у меня проблема с корзиной
// запрос на Mysql
'SELECT id,name,cost FROM goods WHERE id IN ('+req.body.key.join(',')+')',
// что должно получиться на Mongo
app.post('/get-goods-info', function(req, res){
console.log(req.body.key);
if (req.body.key.length !=0) {
const goods = mongoose.model("goods", GoodsSchema);
goods.find({
_id : {
$in : new ObjectId("+req.body.key.join(',')+")
}
},function(error, result,fiels){
if(error) throw error;
let goods = {};
for (let i = 0; i < result.length; i++) {
goods[result[i]['_id']] = result[i];
}
res.json(goods)
});
} else {
res.send('0')
}
});
// Ajax запрос
let cart = {}
document.querySelectorAll(".add-to-cart").forEach(function(element){
element.onclick = addToCart;
});
if(localStorage.getItem('cart')){
cart = JSON.parse(localStorage.getItem('cart'));
ajaxGetGoodsInfo()
}
function addToCart(){
let goodsId = this.dataset.goods_id;
if(cart[goodsId]) {
cart[goodsId]++;
} else {
cart[goodsId] = 1;
}
console.log(cart)
ajaxGetGoodsInfo();
}
function ajaxGetGoodsInfo() {
updateLocalStorageCart();
fetch('/get-goods-info',{
method: 'POST',
body: JSON.stringify({key: Object.keys(cart)}),
headers: {
'Accept' : 'application/json',
'Content-Type' : 'application/json'
}
}).then(function(response){
return response.text()
}).then(function(body){
console.log(body)
showCart(JSON.parse(body));
})
}
// И вот что показывает
Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
Вроде как проблема в это строке кода. Но я уже все перепробовал
goods.find({
_id : {
$in : new ObjectId("+req.body.key.join(',')+")
}
Ответы (1 шт):
Автор решения: nörbörnën
→ Ссылка
Попробуйте так:
app.post('/get-goods-info', (req, res) => {
if (!req.body.key || req.body.key.length === 0) {
res.send('0');
}
const goods = mongoose.model('goods', GoodsSchema);
const idx = req.body.key.map((x) => new ObjectId(x));
goods.find(
{
_id: {
$in: idx
}
},
(error, result) => {
if (error) {
console.error(err);
throw error;
}
const goods = result.reduce(
(acc, item) => {
acc[item['_id']] = item;
return acc;
},
{}
);
res.json(goods);
}
);
});