【问题标题】:Schema method for all Schema's - Mongoose method inheritance所有 Schema 的 Schema 方法 - Mongoose 方法继承
【发布时间】:2023-03-14 22:05:01
【问题描述】:

我正在使用 Mongoose 在 nodejs 中工作,此时我在不同的集合中使用 _id 为用户编写字符串,我尝试对此进行重构并自动生成 _id。

我希望在其他文件中只有 js 函数 generateID(return _id;);并在所有模型中实现此功能,而无需在所有模型中一遍又一遍地编写。

这是bus.js

/***********************************Bus Model**********************************/

var mongoose = require('mongoose'),
    merge    = require('merge'),
    global   = require('./schema/global');

/***********************************Schema******************************************/
var Schema = mongoose.Schema;

var busSchema = new Schema({});

/***********************************Methods*****************************************/
var bus = mongoose.model('Bus', busSchema);

/**
 * extend functions from global
 * we do this to prevent duplicate code
 */
merge(bus.schema.methods, global.schema.methods);

module.exports = bus;

这是项目中模型文件夹的架构文件夹中的 global.js

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var globalSchema = new Schema({});

function objectIdAsString() {
    return mongoose.Types.ObjectId().toString();
}

globalSchema.methods.objectIdAsString = objectIdAsString;;

module.exports = mongoose.model('global', globalSchema);

并且在 route.js 中有这个实现:

var bus = new Bus();

bus._id = bus.objectIdAsString();

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    解决方案是创建一个 Mongoose 插件

    http://mongoosejs.com/docs/plugins.html

    global.js

    var mongoose = require('mongoose');
    
    module.exports = exports = function objectIdAsString(schema) {
      schema.methods.objectIdAsString = function objectIdAsString() {
        return mongoose.Types.ObjectId().toString();
      };
    }
    

    bus.js

    /***********************************Bus Model**********************************/
    
    var mongoose = require('mongoose'),
        merge    = require('merge'),
        global   = require('./schema/global');
    
    /***********************************Schema******************************************/
    var Schema = mongoose.Schema;
    
    var busSchema = new Schema({});
    /**
     * extend functions from global
     * we do this to prevent duplicate code
     */
    busSchema.plugin(global);
    
    module.exports = mongoose.model('Bus', busSchema);
    

    其他地方:

    var bus = new bus();
    console.log(bus.objectIdAsString());
    

    正在为我工​​作并输出正确的值:

    566b35a02a54c60e168c3a9f
    566b35a02a54c60e168c3aa1
    566b35a02a54c60e168c3aa3
    .....
    

    【讨论】:

    • Ummmmmm 好的,我试试这个,告诉你是否适合我。
    • @AndrsAvelinoMonasterioMoren 让我知道它是否有效。我自己试了一下,在Model类中可以访问generateID函数。只需将generateID的内容替换为自己的代码
    • 不起作用,合并(bus.schema.methods, global.schema.methods); __v: 93 } 在查询中没有方法 'objectIdAsString'。 (/home/developer/rube/server/routes.js:1017:35) 在 /home/developer/rube/server/node_modules/mongoose/node_modules/ kareem/index.js:177:19 at /home/developer/rube/server/node_modules/mongoose/node_modules/kareem/index.js:109:16 at process._tickDomainCallback (node.js:459:13)
    • 是 npm 安装合并
    • 总线上的函数怎么调用?
    猜你喜欢
    • 2023-03-17
    • 2015-04-11
    • 2022-01-24
    • 1970-01-01
    • 2021-09-10
    • 2023-02-01
    • 2019-10-03
    • 2014-11-13
    • 1970-01-01
    相关资源
    最近更新 更多