2017-08-06 1 views
1

Ich stoße auf ein Problem, wo mein Mongoose pre.save() Hook feuert, aber das Attribut nicht in der Datenbank gespeichert wird. Ich habe lange gesucht, ohne eine Antwort zu finden. Ich fand this thread, und das Verhalten, das ich erfahre, ist sehr ähnlich, aber OP-Problem ist mit dem Kontext von this verbunden, während ich ein anderes Problem zu haben scheinen.Mungo pre-save Hook feuert, aber nicht persistent Daten

Hier ist meine 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; 

Und hier sind die jeweiligen Linien in der Routerdatei 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); 
    }); 
}); 

Ich kann den Blog-Eintrag in die Datenbank speichern und mein console.log druckt den Slug korrekt auf die Konsole aus. Das this.slug in dem Pre-save-Hook wird jedoch in der Datenbank nicht beibehalten.

Kann jemand sehen, was das Problem hier ist? Vielen Dank im Voraus.

Antwort

1

Mungo wird gemäß dem von Ihnen definierten Schema handeln.
Momentan enthält Ihr Schema kein Feld mit dem Namen slug.

Sie sollten ein slug Feld zu Ihrem Schema hinzufügen.

Ändern der aktuellen Schema zu so etwas wie dies funktionieren sollte:

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

Thank you so viel, fest das das Problem - ich erwartete es möglich sein Attribute anhängen möchte ich ein normales JS-Objekt. –