mongoose预存钩子,但不保留数据

我遇到了一个问题,我的Mongoose pre.save()钩子正在触发,但属性不会保存到数据库。 我一直在寻找很长一段时间没有find答案。我发现这个线程 ,我遇到的行为是非常类似的,但OP的问题是与这个背景有关,而我似乎有一个不同的问题。

这是我的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正确地将slug打印到控制台。 但是,预保存钩子中的this.slug不会保留在数据库中。

有人可以看到问题在这里吗? 非常感谢你提前。

mongoose将根据您定义的模式行事。
目前,您的模式不包含名为slug的提交。

你应该添加一个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 } });