我的变量cart
似乎在回调块内声明。
如果我声明一个新变量(例如newCart
)而不是重新分配它,它将起作用。
cartRouter.post('/', (req,res) => {
var username = req.body.username;
var cart = req.body.cart;
User.find({ username }, (err, res_find) => {
if(err) throw err;
var user_id = res_find[0]._id;
var cart = new Cart({ cart, user: user_id })
cart.save((err_save, cart_save) => {
if (err_save) {
res.json({ "resultType": "failure", "resultMessage": err });
} else {
res.json({ "resultType": "success", "resultMessage": "Cart successfully saved." });
}
})
})
}
在var cart = new Cart({ cart, user: user_id })
行中,如果我声明一个新变量var newCart,然后将其与newCart.save()
而不是cart.save()
一起使用,则可以,但是我不确定为什么。
答案 0 :(得分:1)
写作时
var cart = new Cart({cart, user: user_id});
变量cart
的范围是回调函数。即使在变量的初始化表达式中,它也会尝试使用局部变量,而不是包含函数中的局部变量。但是由于变量尚未初始化,因此值为undefined
。从本质上讲,它等同于编写:
var cart;
cart = new Cart({cart, user:user_id});
因此,如果要同时引用外部变量,则需要使用其他变量名。
如果您尝试使用let
而非var
,则实际上会出现错误
初始化前无法访问购物车
(至少在Chrome中,我不知道ES6是否需要这样做)。