使用Express.js在MongoDB中存储布尔值:注册时isAdmin始终为false的解决方法
问题:MongoDB中isAdmin字段始终无法设置为true
我尝试在MongoDB中存储布尔值,但isAdmin字段始终为false。
数据库Schema
const UserSchema = new Schema({ name: String, password: { type: String, required: true }, isAdmin: { type: Boolean, default: false }, });
Postman发送的请求
{ "name": "aj", "password":"aj", "isAdmin": true }
数据库存储结果
{ "isAdmin": false, "name": "aj", "password": "$2a$10$wBfElJ3YbZoOk3Bz/tyFc.uzZGuzStDppDCINZ8mZexZKumnDMmoW" }
POST请求路由代码
router.post("/auth/signup", async (req, res) => { console.log(res); if (!req.body.email || !req.body.password) { res.json({ success: false, message: "Please enter your email and password" }); } else { try { let newUser = new User(); newUser.name = req.body.name; newUser.email = req.body.email; newUser.password = req.body.password; await newUser.save(); let token = jwt.sign(newUser.toJSON(), process.env.SECRET, { expiresIn: 604800 //1 WEEK }); res.json({ success: true, token: token, message: "Successfully created" }); } catch (err) { console.log(err) res.status(500).json({ success: false, message: err.message }); } } });
请问如何在注册时将isAdmin设置为true或false?
解决方案
问题核心是你没有将请求中的isAdmin值赋值给新建的User实例,Schema里isAdmin默认值为false,所以未赋值时会一直使用默认值。
修改步骤:
在路由代码中添加一行,将请求体里的isAdmin赋值给User实例:
router.post("/auth/signup", async (req, res) => { console.log(res); // 注意:当前请求未传入email,但代码里校验了email,会导致请求失败,需调整:要么请求加email字段,要么移除email校验 if (!req.body.email || !req.body.password) { res.json({ success: false, message: "Please enter your email and password" }); } else { try { let newUser = new User(); newUser.name = req.body.name; newUser.email = req.body.email; newUser.password = req.body.password; // 新增这行,赋值isAdmin字段 newUser.isAdmin = req.body.isAdmin; await newUser.save(); let token = jwt.sign(newUser.toJSON(), process.env.SECRET, { expiresIn: 604800 //1 WEEK }); res.json({ success: true, token: token, message: "Successfully created" }); } catch (err) { console.log(err) res.status(500).json({ success: false, message: err.message }); } } });
额外提示:
你的Schema里并没有定义email字段,但路由代码里校验了req.body.email,同时请求中也没传email,这会导致请求直接返回失败。需要二选一:
- 在Postman请求中添加
email字段; - 移除路由里的
!req.body.email校验逻辑(如果业务不需要email字段的话)。
内容的提问来源于stack exchange,提问作者xander
相关产品推荐
相关产品推荐

