Node.js使用静态方法向MongoDB存储用户时出现空值错误
问题分析与解决
问题根源
路由代码调用User.signup()时传入的是一个对象:
const user = await User.signup({ profilePicture, username, email, password, });
但静态方法signup定义的是接收四个独立参数:
UserSchema.statics.signup = async function ( profilePicture, username, email, password ) { ... }
此时静态方法内的profilePicture、username等参数实际均为undefined(第一个参数是对象,剩余三个参数未传入),导致空值校验!password || !profilePicture || !username || !email触发,抛出"missing"错误。
解决方案
两种修复方式任选其一即可:
方式一:修改静态方法为接收对象参数
调整静态方法的参数结构,解构传入的对象:
UserSchema.statics.signup = async function ({ profilePicture, username, email, password }) { const exist = await this.findOne({ username }); if (exist) { throw Error("username exist"); } if (!password || !profilePicture || !username || !email) { throw Error("missing"); } // 后续可恢复密码哈希逻辑 // const salt = await bcrypt.genSalt(10); // const hash = await bcrypt.hash(password, salt); const user = await this.create({ username, password, profilePicture, email, }); return user; };
方式二:修改路由调用时传入独立参数
保持静态方法不变,调整路由内的调用方式,直接传递四个变量:
const user = await User.signup( profilePicture, username, email, password );
额外优化点
路由内的响应状态码逻辑有误,建议修正:
try { const user = await User.signup(...); const token = createToken(user._id); // 注册成功返回201(资源创建成功) res.status(201).json({ username, token }); } catch (error) { // 用户名冲突返回409(资源冲突),其他错误返回400(请求错误) const statusCode = error.message === "username exist" ? 409 : 400; res.status(statusCode).json({ error: error.message }); }
内容的提问来源于stack exchange,提问作者Ibrahim Yahyaoui
相关产品推荐
相关产品推荐

