从对象中删除密钥但仍显示响应

Oll*_*619 1 mongoose node.js express ecmascript-2016

我正在尝试节点身份验证,我已设法将用户名和散列密码存储到我的数据库中,但我想返回 json 而不带散列密码。

我在发回 JSON 之前删除了密码密钥,但密码仍然显示在返回的结果中。

router.post("/signup", async (req, res, next) => {
  const user = await User.exists({ username: req.body.username });

  if (user) {
    const error = new Error("Username already exists");
    next(error);
  } else {
    const newUser = new User({
      username: req.body.username,
      password: req.body.password,
    });

    try {
      const result = await newUser.save();
      delete result.password;
      res.json(result);
    } catch (err) {
      res.json(err.errors);
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

用户模型有一个预钩子,可以在保存之前对密码进行哈希处理:

userSchema.pre("save", async function save(next) {
  const user = this;

  if (!user.isModified("password")) return next();

  try {
    user.password = await bcrypt.hash(user.password, 12);
    return next();
  } catch (err) {
    return next(err);
  }
});
Run Code Online (Sandbox Code Playgroud)

Oll*_*619 7

这是感谢 Mahan 指出的解决方案。 result返回一个 Mongoose 对象,因此需要首先转换为普通的 Javascript 对象。

try {
      let result = await newUser.save();
      result = result.toObject();
      delete result.password;
      res.json(result);
    } catch (err) {
      res.json(err.errors);
    }
Run Code Online (Sandbox Code Playgroud)