私はいくつかのスキーマを、同じベースプロパティを共有するより複雑なものの基礎として使用できるMongooseで、後に続くすべてのスキーマでこれらを繰り返さないように、マングースで組み込みスキーマモデルを設定しようとしています。それらを必要とする(DRY原則)。究極の目標は、これらすべてを同じMongoDBコレクションの下に格納することです。ここでMongooseでスキーマを拡張する方法は?
は私がlodash extend
使用して、実行しようとしました何の目安です:
/* 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");
を、私は、POSTのために以下の構成を使用してノードおよびExpressでユーザーAPIを設定してい:
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);
});
この設定では、新しいUserSchemaプロパティ(versionTC
またはpassword
)のいずれかを省略してAPIに投稿しようとするたびに、ユーザは両方ともとして定義されているにもかかわらず、Mongoに保存されます。
ただし、PersonSchema(firstName
,lastName
またはemail
)のいずれかのプロパティを省略すると、予想通りに500エラーでPOSTが失敗します。
最後に、PersonSchemaをlodashで拡張せずにUserSchema内の5つのプロパティをすべて定義すると、POST要求本体の不足しているプロパティは(期待どおり)500サーバーエラーになります。
これはMongooseの問題ではないと私は間違いをしている可能性が高いと確信していますが、私はそれが何であるか把握できません。どんな助けでも大歓迎です。