node.js和express使用mongoDB做注册接口时出现Cannot read property ‘_id‘ of undefined

node.js和express使用mongoDB做注册接口时出现Cannot read property ‘_id‘ of undefined

前言

在学习React框架使用mongoDB搭建后台写注册接口注册用户信息时,出现了一个Bug提示Cannot read property ‘_id‘ of undefined,我寻思着mongoDB是自增的_id,储存时直接save 逻辑就很合理

一、原代码

router.post('/register', function(req, res) {

    // 读取请求参数数据



    const { username, password,type } = req.body


    // 1,判断 看用户是否存在

    UserModel.findOne( { username }, function(err, user) {

        if (user) {
            // 返回提示错误信息
            res.send({ code: 1, msg: '此用户已存在' })

        } else {

            // 保存注册的用户数据
            new UserModel({ username, password: md5(password), type }).save(function(err, user) {
                //cookie一下
                res.cookie('userid', user._id , { maxAge: 1000*60*60*24 })

                // 响应数据中,不携带密码
                const data = { _id:  user._id , username, type }
                res.send({ code: 0, data })
            
            })
        }
    })


    // 返回响应数据
})
module.exports = router;

经过一下午查找文章发现原来是mongoDB自增的_id数据类型的问题:

  1. mongoDB自增的数据类型是ObjectId而我在后天返回的数据时json格式
  2. 发现问题:把_id当做json格式的id来使用
  3. 解决方案:
    引入mongoDB的ObjectId:

const ObjectId = require(‘mongodb’).ObjectId

把从后台得到的id进行类型转换:

const id = ObjectId(req.body.id)

然后就可以使用cookie和save()

完整代码

代码如下:

var express = require('express');
var router = express.Router();

const md5 = require('blueimp-md5')
const {UserModel} = require('../db/models')
const filter = {password: 0, __v: 0} // 指定过滤的属性
const ObjectId = require('mongodb').ObjectId

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

// 注册一个路由: 用户注册


router.post('/register', function(req, res) {

    // 读取请求参数数据

    const id = ObjectId(req.body.id)

    const { username, password,type } = req.body

    console.log(req.body.type)


    // 1,判断 看用户是否存在

    UserModel.findOne( { username }, function(err, user) {

        if (user) {
            // 返回提示错误信息
            res.send({ code: 1, msg: '此用户已存在' })

        } else {

            // 保存注册的用户数据
            new UserModel({ username, password: md5(password), type }).save(function(err, user) {
                //cookie一下
                res.cookie('userid', id/* user._id */, { maxAge: 1000*60*60*24 })

                // 响应数据中,不携带密码
                const data = { _id: id/* user._id */, username, type }
                res.send({ code: 0, data })

            })
        }
    })


    // 返回响应数据
})
module.exports = router;

postman测试之后结果:
在这里插入图片描述

总结

还有一个待解决问题就是:用户类型type没有存储到,响应的数据中无type值,console.log一下之后是undefined !!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值