V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vincentxue
V2EX  ›  Node.js

egg-mongoose 的写法怎么实现 Discriminators?

  •  
  •   vincentxue · 2019-04-22 15:01:37 +08:00 · 3561 次点击
    这是一个创建于 1824 天前的主题,其中的信息可能已经有所发展或是发生改变。

    正常的 Mongoose 里 不使用 Discriminators 的写法:

    > models/book.js
    
    // Define our Book schema
    const BookSchema = new mongoose.Schema(
      {
        title: { type: String, required: true },
        author: { type: String, required: true },
        release_date: { type: Date, required: true },
      }
    );
    
    // Create a model from our schema
    module.exports = mongoose.model('Book', BookSchema);
    
    > models/movie.js
    
    const MovieSchema = new mongoose.Schema(
      {
        title: { type: String, required: true },
        director: { type: String, required: true },
        release_date: { type: Date, required: true },
      }
    );
    
    module.exports = mongoose.model('Movie', MovieSchema);
    

    使用 Discriminators 的写法:

    > models/book.js
    
    const baseOptions = {
      discriminatorKey: 'itemtype', // our discriminator key, could be anything
      collection: 'items', // the name of our collection
    };
    
    const Base = mongoose.model('Base', new mongoose.Schema({
          title: { type: String, required: true },
          date_added: { type: Date, required: true },
          redo: { type: Boolean, required: false },
        }, baseOptions,
      ),
    );
    
    module.exports = mongoose.model('Base');
    
    > models/book.js
    
    const Base = require('./base'); // we have to make sure our Book schema is aware of the Base schema
    
    const Book = Base.discriminator('Book', new mongoose.Schema({
        author: { type: String, required: true },
      }),
    );
    
    module.exports = mongoose.model('Book');
    
    > models/movie.js
    
    const Base = require('./base');
    
    const Movie = Base.discriminator('Movie', new mongoose.Schema({
        director: { type: String, required: true },
      }),
    );
    
    module.exports = mongoose.model('Movie');
    

    上面的例子在 egg-mongoose 里这样写:

    > {app_root}/app/model/base.js
    
    module.exports = app => {
      const mongoose = app.mongoose;
      const Schema = mongoose.Schema;
    
      const baseOptions = {
      discriminatorKey: 'itemtype', // our discriminator key, could be anything
      collection: 'items', // the name of our collection
      };
    
    const BaseScheme = new Schema({
          title: { type: String, required: true },
          date_added: { type: Date, required: true },
          redo: { type: Boolean, required: false },
        }, baseOptions);
    
      return mongoose.model('Base', BaseScheme);
    };
    
    > {app_root}/app/model/book.js
    
    const Base = require('./base');
    
    module.exports = app => {
      const mongoose = app.mongoose;
      const Schema = mongoose.Schema;
      
      const BookSchema = new Schema({
        author: { type: String, required: true },
      });
      
      return Base.discriminator('Book', BookSchema);
    };
    

    这样做会报错,提示:

    ERROR 30161 nodejs.TypeError: Base.discriminator is not a function
    

    请问在 egg-mongoose 中在保持 model 分离的前提下如何实现上述功能?

    其他

    上面例子的代码源自 Getting started with Mongoose discriminators in Express.js

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5227 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 07:02 · PVG 15:02 · LAX 00:02 · JFK 03:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.