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数据类型的问题:
- mongoDB自增的数据类型是ObjectId而我在后天返回的数据时json格式
- 发现问题:把_id当做json格式的id来使用
- 解决方案:
引入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 !!!