【问题标题】:How to change multiple properties of an object at once in Javascript?如何在 Javascript 中一次更改对象的多个属性?
【发布时间】:2019-07-16 19:10:30
【问题描述】:

我正在尝试使用 mongoose 更新文档。我想一次更新多个属性。我尝试使用扩展运算符克隆文档并覆盖需要使用用户输入更新的属性,但它返回错误document.save is not a function。我有点理解它为什么会抛出错误。因为它不是同一个对象,它只是一个克隆所以它没有save 方法。如果我错了,请纠正我。 所以我的问题是:有没有办法像使用扩展运算符一样更新对象?

我的代码:

router.put("/posts/update", (req, res)=>{
    const {id, updatedFields} = req.body;
    Post.findById(id).exec((err, post)=>{
        if(err) throw err;
        post = {...post, updatedFields};
        post.save();
        res.json(post);
    })
});

【问题讨论】:

  • 也许可以试试 -> Object.assign(post, updateFields)
  • 请注意:我不是猫鼬专家。但这样做看起来是一个非常糟糕的安全问题。如果有人发送 -> {"post": "return fs.readFileSync(\"rootpassword.txt\")"} 或类似的东西怎么办。
  • 目前,我正在学习如何使用 nodejs 构建一个 react 应用程序。除了使用 Helmetjs 中间件,我对安全性一无所知,我认为这还不够。熟悉nodejs之后再学习安全性。

标签: javascript object mongoose


【解决方案1】:

您可以使用Object.assign

post= Object.assign(post, updatedFields);

assign 函数可以接受任意数量的参数。每个参数都应用在最左边,从左到右。因此,如果多个参数具有相同的属性,则其值将是右边的那个。

【讨论】:

  • Empty {} 未分配 :)
【解决方案2】:

使用Object.assing 它不会改变对象引用。

我会建议 instate 抛出错误,发送带有一些状态码的响应。

router.put("/posts/update", (req, res) => {
    const {
        id,
        updatedFields
    } = req.body;
    Post.findById(id).exec((err, post) => {
        if (err) return res.status(400).json({err, msg: 'Some msg'});
        post = Object.assign(post, updatedFields);
        post.save();
        res.json(post);
    })
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多