5.26 mongoose模型的小坑,node中cookie存取,express全局拦截,mongoose删除数据,mongoose更新操作,==和===和?,mongoDB脏数据以及空数据

    xiaoxiao2025-01-17  16

    1、mongoDB中的collection一旦定义属性(createCollection({…})),则严格遵从定义的属性,除非定义发生改变。 mongoose的Schema对象中的属性,是你最终collection对象的属性的限制集。就是说,Schema的定义完毕后,会不容许非定义属性的加入。比如findOne()出的一个对象data,会受Schema的限制。如果age属性没被定义入Schema模型,则不容许你data.age = 22的加入。

    2、首先cookie是保存在客户端的,在nodejs中操作cookie。 存储cookie

    // 是response应答 res.cookie('userId', doc.userId, { path: '/', // 将cookie放在根域名 maxAge: 1000 * 60 * 60, // cookie周期 })

    取cookie

    // 从request中获取 req.cookies.userId

    注:前端可以通过document.cookie读取cookie

    3、nodejs中express提供的app.use方法,在加载路由前执行,可以做到全局拦截的效果。

    // 在路由载入之前就实行拦截代码 app.use(function (req, res, next) { // 判断用户登录状态 if (req.cookies.userId) { next() // 让程序往下走 } else { // 白名单接口配置 console.log(req.originalUrl) // 当前接口地址 if (req.originalUrl === '/users/login' || req.originalUrl === '/users/logout' || req.originalUrl === '/goods') { next() } else { // json返回即中断下文执行,即拦截 res.json({ status: 10001, msg: '当前未登录', result: '' }) } } }) // 以下是各条路由

    注意点: req.originalUrl : 表示接口地址,带参数(/goods/list?name=‘killhand’&age=‘23’) req.path : 表示接口的路径,不带参数 (/goods/list)

    4、mongoose的用法很活。删除操作如下: 个人删除购物车单项操作:

    router.post('/cart/del', function (req, res, next) { // 已全局拦截,故理论已登录 const userId = req.cookies.userId const productId = req.body.productId // 1、查询用户购物车 const cart = Users.findOne({userId}, function (err, doc) { if (err) { res.json({ status: 1, msg: err.message, result: '' }) } else { if (doc) { // 2、比对购物车 doc.cartList.forEach((item, index) => { if (item.productId === productId) { doc.cartList.splice(index, 1) } }) // 数组发生改变,save到mongoDB中 doc.save(function (err, doc) { if (err) { res.json({ status: 1, msg: err.message, result: '' }) } else { if (doc) { res.json({ status: 0, msg: '', result: doc.cartList }) } } }) } } }) })

    大致就是1、判断用户登录态 2、根据cookie查用户表 3、比对req.body.productId和用户表productId 4、比对成功通过splice删除单项数据 5、返回数组给前端重新渲染

    大佬的购物车单项删除流程如下:

    router.post('/cart/del', function (req, res, next) { // 已全局拦截,故理论已登录 const userId = req.cookies.userId const productId = req.body.productId //或者mongoDB的删除操作 Users.update({userId}, { $pull:{ 'cartList': { productId } } }, function(err, doc) { if (err) { res.json({ status: 1, msg: err.message, result: '' }) } else { res.json({ status: 0, msg: '', result: doc }) } }) })

    大致思路: 1、判断用户登录态 2、根据cookie更新用户表 其中第2步,核心是mongoDB的更新语法以mongoose语法实现+$pull 代码: Users.update({userId},{$pull:{‘cartList’:{productId: productId}}}) 也就是:

    Users.update({userId}, { $pull:{ 'cartList': { productId } } }, (err, doc)=>{此处跟回调方法})

    5、mongoose的更新数据语法,其实包括了删除操作。 Users.update({多对象查询},{更新操作},()=>{回调函数}) // 这是mongoose更新操作的核心

    6、==是值等于,===是绝对等于,而?相当于if判断 const str = ‘0’ // 这里str是字符串0,非数字0 str == 0 // true,'0’和0值相等 str === 0 // false,'0’和0值相等,但类型不相等 if(str) // true,'0’是非空字符串,恒为真,非0,或false 总结: 非空字符串,恒为真。而等于号的判断按情况而定。

    7、脏数据:即处理不正确的数据。mongoDB建模初期容易出现。 就是在Schema原型中没有定义最终属性,而先创建的数据,但在之后Schema又引入新属性,又创建数据。 因为Schema的限制,新旧数据属性不同。故引用旧数据的时候可能出现属性undefined,需要小心。 空数据:值为空的数据。mongoDB会注销空数据 在mongoDB中,值为空的属性,将被注销,即消失。该属性便不存在,更不能调用该属性的值。所以,要注意赋值的时候,参数传递是否正确,以免发生空参传递,注销了mongoDB的属性。

    最新回复(0)