【问题标题】:Mongoose pre-save hook fires, but does not persist dataMongoose 预保存钩子触发,但不保存数据
【发布时间】:2018-01-14 00:12:31
【问题描述】:

我遇到了一个问题,我的 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 打印到控制台。但是,pre-save 钩子中的this.slug 不会持久化到数据库中。

任何人都可以看到这里的问题吗?非常感谢您。

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

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

    【讨论】:

    • 非常感谢,这解决了这个问题 - 我希望可以像添加普通 JS 对象一样附加属性。
    猜你喜欢
    • 2020-10-14
    • 2020-05-13
    • 2015-08-29
    • 1970-01-01
    • 2016-02-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多