【问题标题】:deleting key from object but still showing in response从对象中删除键但仍显示在响应中
【发布时间】:2020-07-15 14:03:16
【问题描述】:

我正在尝试节点身份验证,我已设法将用户名和哈希密码存储到我的数据库中,但我想返回没有哈希密码的 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);
    }
  }
});

User 模型有一个 pre hook 在保存之前对密码进行哈希处理:

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

【问题讨论】:

  • 我认为问题在于您为结果变量定义了const 而不是let
  • 我试过了,但没用 :(
  • 这样,它应该可以正常工作。如果你console.log(result)res.json(result)之前,你能看到密码已经被删除了吗?如果是这种情况,可能是其他路线干扰了您的响应正文(只是猜测)。
  • 如果对象中出现删除前后
  • 这里有一个解决方案:stackoverflow.com/questions/23342558/…

标签: node.js express mongoose ecmascript-2016


【解决方案1】:

感谢马汉指出,这是解决方案。 result 返回一个 Mongoose 对象,所以需要先转换成一个普通的 Javascript 对象。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2014-08-23
    相关资源
    最近更新 更多