javascript - 无法预先 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`,
});
}
}
);
});
解决方案
推荐阅读
- excel - 打开文本文件并检查它是否已被编辑
- deezer - 如何获取 Deezer 用户的完整跟踪历史记录?
- java - Apache Pig:包中最常见的值
- node.js - 为什么 fastify-cli 生成的应用程序和文档中的示例如此不同?
- javascript - For循环使用两个变量?
- proxy - 代理链无法连接
- android - firebase crashlytics 集成不起作用
- java - java8层次数据json解析并以平面格式存储在mongodb中
- python - python中的内部类和内部内部类有什么区别?
- r - 从 RIDGE、LASSO 和带系数 (R) 的网络弹性回归中提取公式,用于许多变量