Node.js 正在从对象中删除密钥,但仍显示在响应中
我正在试验节点身份验证,我已经成功地将用户名和散列密码存储到数据库中,但我想返回json而不使用散列密码 在返回JSON之前,我正在删除密码密钥,但返回的结果中仍然显示密码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 =
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)
,您能看到密码已被删除吗?如果是这样,可能是其他路由干扰了您的响应正文(只是猜测)。如果在删除之前和之后的对象中出现,则为您提供一个解决方案: