2017-08-06 72 views
1

我遇到了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不会保留在数据库中。

任何人都可以看到问题在这里吗?提前谢谢你。

回答

1

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  
    } 
}); 
+0

太感谢你了,这个固定的问题 - 我期待它是可以附加属性,像我就一个正常的JS对象。 –