首页 > 解决方案 > 无法预先 FindOneAndUpdate 并更改数据中的字段

问题描述

我正在尝试使用 Mongoose 和 node.js 创建一个博客,但我无法解决我遇到的问题:基本上我正在尝试获取 pre FindOneAndUpdate 挂钩我正在推送到数据博客的新帖子,采取来自它的内容,使用(markdown it)渲染并将渲染的html内容保存在contentHTML上。

    const BlogSchema = new Schema({
  name: {
    type: String,
    require: true,
    lowercase: true,
  },
  id: {
    type: Number,
    unique: true,
    require: true,
    lowercase: true,
  },
  premium: {
    type: Boolean,
    default: false,
    require: true,
  },
  settings: [
    {
      permissions: [
        {
          roleID: {
            type: Number,
            require: true,
            default: "everyone",
          },
        },
      ],
      channelID: {
        type: Number,
        require: true,
      },
      ownerID: {
        type: Number,
        require: true,
      },
      region: {
        type: String,
        require: true,
      },
    },
  ],
  posts: [
    {
      tags: [
        {
          type: String,
          require: false,
          lowercase: true,
        },
      ],
      author: [
        {
          id: {
            type: String,
            require: true,
          },
          name: {
            type: String,
            require: true,
          },
          icon: {
            type: String,
            require: true,
          },
        },
      ],
      upVotes: {
        type: Number,
        unique: true,
        require: true,
        lowercase: true,
        default: 0,
      },
      downVotes: {
        type: Number,
        unique: true,
        require: true,
        lowercase: true,
        default: 0,
      },
      id: {
        type: String,
        require: true,
        unique: true,
        default: shortid.generate,
      },
      title: {
        type: String,
        require: true,
        unique: true,
        lowercase: true,
      },
      content: {
        type: String,
        require: true,
      },
      contentHTML: {
        type: String,
        require: true,
        default: "",
      },
      date: {
        type: String,
        default: moment().format("MMM Do YY"),
        require: true,
      },
    },
  ],
  createdAt: {
    type: Date,
    default: new Date(),
    require: true,
  },
});
BlogSchema.pre("findOneAndUpdate", async function (next) {
  var index = Object.keys(this.getUpdate().$push.posts);
  var post = this.getUpdate().$push.posts[index];
  var content = post.content;
  var title = post.title;
  this.findOne({ name: this.getQuery().name }).then(async (result) => {
    result.posts.find((post) => post.title === title).contentHTML =
      md.render(content);

    result.save();
  });

  next();
});

有时,不知道为什么代码可以工作,但是一旦我创建了一个不同名称的新帖子,代码就会崩溃,我得到了这个在此处输入图像描述

问题是,当我控制台记录我想要获得的标题时,它正在工作,我也从新帖子和内容中获得了标题,但我不知道为什么我找不到这个帖子包含这些参数。有人可以帮我吗?

这是我用来将新帖子推送到数据的代码

  app.post("/create/:name/post", (req, res, next) => {
    for (let i in req.body) {
      if (req.body[i].length <= 0) return res.send(`Invalid ${[i]} provided`);
    }
    Blog.findOneAndUpdate(
      { name: req.params.name },
      { $push: { posts: [req.body] } },
      (err, result) => {
        if (result === null) return res.send(`Could not find this blog!`);
        else {
          res.json({
            icon: "success",
            msg: `Post ${req.body.title} created`,
          });
        }
      }
    );
  });

标签: javascriptnode.jsdatabasemongodbmongoose

解决方案


推荐阅读