2017-12-22 5 views
0

Ich versuche, ein Schuppenmodell in Mongoose einzurichten, in dem einige Schemas als Grundlage für komplexere verwendet werden könnten, die alle die gleichen Basiseigenschaften haben, um sie nicht für jedes nachfolgende Schema zu wiederholen erfordert sie (DRY-Prinzipien). Das ultimative Ziel ist es, all diese Elemente in derselben MongoDB-Sammlung zu speichern.Wie erweitert man Schemata in Mongoose?

Hier ist eine grobe Vorstellung von dem, was ich zu tun versucht, lodash extend mit:

/* Schemas */ 

import { Schema } from "mongoose"; 
import * as _ from 'lodash'; 

var PersonSchema: Schema = new Schema({ 
    email:  {type: String, required:true, unique:true}, 
    lastName: {type: String, required:true}, 
    firstName: {type: String, required:true} 
}); 

export var UserSchema: Schema = _.merge({}, PersonSchema, { 
    password: {type: String, required:true}, 
    versionTC: {type: String, required:true} 
}); 


/* Models */ 

import mongoose = require("mongoose"); 
import { Document, Model } from "mongoose"; 

export interface UserModel extends Document {} 
export interface UserModelStatic extends Model<UserModel> {} 
export const User = mongoose.model<UserModel, UserModelStatic>("User", UserSchema, "users"); 

Dann, ich bin ein Nutzer-API mit Knoten und Express mit der folgenden Konfiguration für POST einrichten:

import { Response, Request, NextFunction, Router } from "express"; 
import { User, UserModel } from "../models/user"; 

// Create method 
public create(req: Request, res: Response, next: NextFunction) { 
    const user = new User(req.body); 
    user.save().then(user => { 
     res.json(user.toObject()); 
     next(); 
    }).catch(next); 
} 

// POST route, calling the create() method above 
router.post("/users", (req: Request, res: Response, next: NextFunction) => { 
    new UsersApi().create(req, res, next); 
}); 

Mit diesem Setup, jedes Mal wenn ich versuche, meine API zu schreiben entweder die neuen UserSchema Eigenschaften (versionTC oder password) verzichtet, wobei noch der Benutzer wird in Mongo gespeichert, trotz der Tatsache, dass sie alsbeide definiert sind,.

Wenn ich jedoch eine der Eigenschaften aus dem PersonSchema wegzulassen (firstName, lastName oder email), schlägt der POST als mit einem 500 Fehlern erwartet.

Schließlich, wenn ich alle 5 Eigenschaften in meinem UserSchema definiere, ohne PersonSchema mit lodash zu erweitern, führen alle verpassten Eigenschaften im POST-Anfragetext zu einem 500 Serverfehler (wie erwartet).

Ich bin überzeugt, dass dies kein Problem mit Mungo ist und dass ich wahrscheinlich etwas falsch mache, aber ich kann einfach nicht herausfinden, was das ist. Jede Hilfe würde sehr geschätzt werden.

Antwort

0

Ich landete mit dem mongoose-extend-schema npm Paket:

import extendSchema = require('mongoose-extend-schema'); 

export var UserSchema: Schema = extendSchema(PersonSchema, { 
    password: {type: String, required:true}, 
    versionTC: {type: String, required:true} 
});