Mongoose预保存钩子触发但未保留数据
问题描述:
我遇到了Mongoose pre.save()钩子正在触发的问题,但该属性未保存到数据库。我一直在寻找很久没有找到答案。我发现this thread,我遇到的行为非常相似,但OP的问题与this
的上下文有关,而我似乎有不同的问题。Mongoose预保存钩子触发但未保留数据
这里是我的models.js:
'use strict';
const mongoose = require("mongoose");
const slugify = require("slugify");
let Schema = mongoose.Schema;
let BlogPostSchema = new Schema({
title: {
type: String,
required: true
},
createdAt: {type: Date, default: Date.now},
updatedAt: {type: Date, default: Date.now},
author: String,
post: {
type: String,
required: true
}
});
BlogPostSchema.pre('save', function(next) {
this.slug = slugify(this.title);
console.log(this.slug);
next();
});
// Passed to templates to generate url with slug.
BlogPostSchema.virtual("url").get(function() {
console.log(this.slug);
console.log(this.id);
return this.slug + "/" + this.id;
});
BlogPostSchema.set("toObject", {getters: true});
let BlogPost = mongoose.model("BlogPost", BlogPostSchema);
module.exports.BlogPost = BlogPost;
这里是相关线路中的路由器文件index.js:
const express = require('express');
const router = express.Router();
const BlogPost = require("../models").BlogPost;
// Route for accepting new blog post
router.post("/new-blog-post", (req, res, next) => {
let blogPost = new BlogPost(req.body);
blogPost.save((err, blogPost) => {
if(err) return next(err);
res.status(201);
res.json(blogPost);
});
});
我能够博客文章保存到数据库,并且我的console.log
正确地将控制块打印出来。但是,保存前钩子中的this.slug
不会保留在数据库中。
任何人都可以看到问题在这里吗?提前谢谢你。
答
Mongoose将根据您定义的模式行事。
当前,您的模式不包含名为slug
的s字段。
您应该为您的模式添加slug
字段。
改变当前的模式,以这样的事情应该工作:
let BlogPostSchema = new Schema({
slug: String,
title: {
type: String,
required: true
},
createdAt: {type: Date, default: Date.now},
updatedAt: {type: Date, default: Date.now},
author: String,
post: {
type: String,
required: true
}
});
太感谢你了,这个固定的问题 - 我期待它是可以附加属性,像我就一个正常的JS对象。 –