Node.js 正在从对象中删除密钥,但仍显示在响应中

Node.js 正在从对象中删除密钥,但仍显示在响应中,node.js,express,mongoose,ecmascript-2016,Node.js,Express,Mongoose,Ecmascript 2016,我正在试验节点身份验证,我已经成功地将用户名和散列密码存储到数据库中,但我想返回json而不使用散列密码 在返回JSON之前,我正在删除密码密钥,但返回的结果中仍然显示密码 router.post("/signup", async (req, res, next) => { const user = await User.exists({ username: req.body.username }); if (user) { const error =

我正在试验节点身份验证,我已经成功地将用户名和散列密码存储到数据库中,但我想返回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);
    }
  }
});
用户模型有一个预钩子,用于在保存前散列密码:

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);
  }
});

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

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

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

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

我认为问题是因为您为结果变量定义了
const
,而不是
let
。我尝试过,但没有成功:(这样,它应该可以正常工作。如果在
res.json(result)之前定义
console.log(result)
,您能看到密码已被删除吗?如果是这样,可能是其他路径干扰了您的响应体(只是猜测).If出现在delete之前和之后的对象中这里有一个解决方案:我认为问题是因为您为结果变量定义了
const
,而不是
let
。我尝试过,但没有成功:(这样,它应该可以正常工作。如果在
res.json(result)之前定义了
console.log(result)
,您能看到密码已被删除吗?如果是这样,可能是其他路由干扰了您的响应正文(只是猜测)。如果在删除之前和之后的对象中出现,则为您提供一个解决方案: