Mongoose预保存挂钩火灾,但不会保留数据

时间:2017-08-06 16:34:57

标签: node.js mongodb express mongoose

我遇到了一个问题,我的Mongoose pre.save()挂钩正在触发,但该属性没有保存到数据库中。我找了很长时间没找到答案。我发现this thread,我遇到的行为非常相似,但OP的问题与this的背景有关,而我似乎有一个不同的问题。

这是我的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不会在数据库中保留。

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

1 个答案:

答案 0 :(得分: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    
    }
});