TypeError:无法设置 null - 节点和 Mongoose 的属性“brief_title”

Posted

技术标签:

【中文标题】TypeError:无法设置 null - 节点和 Mongoose 的属性“brief_title”【英文标题】:TypeError: Cannot set property 'brief_title' of null - node and Mongoose 【发布时间】:2020-12-07 23:43:18 【问题描述】:

我有一个使用 Node/Express/Mongo 的应用程序,当我想编辑文档时遇到了麻烦。我可以毫无问题地添加文档,但是当我构建编辑表单时,标题中出现错误。我也可以获取文档并查看我输入的信息。问题是当我尝试保存所做的任何更改时。

这是我的编辑功能:错误发生在 FindByIdAndUpdate 方法中的brief.brief_title = updated_brief_title 处。

 exports.postEditBrief = (req, res, next) => 
    const briefId = req.body.briefId;
    const updated_brief_title = req.body.brief_title;
    const updated_country = req.body.country;
    const updated_psg = req.body.psg;
    const updated_one_year_withholding = req.body.one_year_withholding;
    const updated_withholding_only = req.body.withholding_only;
    const updated_practice_advisory = req.body.practice_advisory;
    const updated_courthouse = req.body.courthouse;
    const updated_pages = req.body.pages;
    const updated_additional_psg = req.body.additional_psg;
    const updated_gangs = req.body.gangs;
    const updated_gang_name = req.body.gang_name;
    const updated_link = req.body.link;

Brief.findByIdAndUpdate(briefId)
  .then(brief => 
    brief.brief_title = updated_brief_title;
    brief.country = updated_country;
    brief.psg = updated_psg;
    brief.one_year_withholding = updated_one_year_withholding;
    brief.withholding_only = updated_withholding_only;
    brief.practice_advisory = updated_practice_advisory;
    brief.courthouse = updated_courthouse;
    brief.pages = updated_pages;
    brief.additional_psg = updated_additional_psg;
    brief.gangs = updated_gangs;
    brief.gang_name = updated_gang_name;
    brief.link = updated_link;
    return brief.save();
  )
  .then(result => 
      console.log(Brief);
  res.redirect('/');
)
.catch(err => console.log(err)); 
;

我在 Mongoose 中尝试过各种“查找和更新”方法,但结果都是一样的。

【问题讨论】:

【参考方案1】:

您需要为要更新的数据创建一个object,并将其作为函数中的第二个参数传递,当您执行.then() 时,它会得到您正在执行的操作的结果,而您却没有不需要像内部那样调用.save()

正确的版本应该是这样的

exports.postEditBrief = (req, res, next) => 
    const briefId = req.body.briefId;
    let update = 
      brief_title: req.body.brief_title,
      country: req.body.country,
      psg: req.body.psg,
      one_year_withholding: req.body.one_year_withholding,
      withholding_only: req.body.withholding_only,
      practice_advisory: req.body.practice_advisory,
      courthouse: req.body.courthouse,
      pages: req.body.pages,
      additional_psg: req.body.additional_psg,
      gangs: req.body.gangs,
      gang_name: req.body.gang_name,
      link: req.body.link
    

    Brief.findByIdAndUpdate(briefId, update)
      .then(result => 
        console.log(result);
        res.redirect('/');
      )
      .catch(err => console.log(err));
  ;

您可以使用object destructuring 进一步简化它。

更新:

如果你不想覆盖你的文档,你需要使用$setfindOneandUpdate

exports.postEditBrief = (req, res, next) => 
        const briefId = req.body.briefId;
        let update = 
          brief_title: req.body.brief_title,
          country: req.body.country,
          psg: req.body.psg,
          one_year_withholding: req.body.one_year_withholding,
          withholding_only: req.body.withholding_only,
          practice_advisory: req.body.practice_advisory,
          courthouse: req.body.courthouse,
          pages: req.body.pages,
          additional_psg: req.body.additional_psg,
          gangs: req.body.gangs,
          gang_name: req.body.gang_name,
          link: req.body.link
        
    
        Brief.findOneAndUpdate(briefId, $set:update)
          .then(result => 
            console.log(result);
            res.redirect('/');
          )
          .catch(err => console.log(err));
      ;

【讨论】:

谢谢。这工作得更好,但 findByIdAndUpdate 方法没有保存到数据库中。控制台中的“结果”为空。 findByOneAndUpdate 确实会保存到数据库中,但会覆盖 ID,因此一旦我更改文档,它就会将该 ID 重置为我拥有的第一个文档,而不是更改文档本身。

以上是关于TypeError:无法设置 null - 节点和 Mongoose 的属性“brief_title”的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的 TypeError:无法设置 null 的属性(设置“innerHTML”)

TypeError:无法将属性'innertext'设置为null

React Ref:未捕获的 TypeError:无法将属性“innerHTML”设置为 null

语法中的 innerHTML 错误不起作用;未捕获的 TypeError:无法设置 null 的属性(设置“innerHTML”)[重复]

CS50 Uncaught TypeError:无法将属性“禁用”设置为 null [重复]

TypeError:无法读取 null 的属性“userID”