ES5 的书架循环依赖

Bookshelf circular dependency with ES5

我有以下代码:

const bookshelf = require('../config/bookshelf');
const BaseModel = require('bookshelf-modelbase')(bookshelf);
const moment = require("moment");

const User = require("./User");
const Meta = require("./Meta");
const Log = require("./Log");

class Session extends BaseModel {
    get tableName() {
        return "sessions";
    }

    get hasTimestamps() {
        return false;
    }

    user() {
        return this.belongsTo(User);
    }

    meta() {
        return this.belongsTo(Meta);
    }

    logs() {
        return this.hasMany(Log);
    }
};

module.exports = Session;

const bookshelf = require('../config/bookshelf');
const BaseModel = require('bookshelf-modelbase')(bookshelf);
const Session = require("./Session");
const moment = require("moment");

class Log extends BaseModel {
    get tableName() {
        return "logs";
    }

    get hasTimestamps() {
        return false;
    }

    session() {
        return this.belongsTo(Session);
    }

    getDate() {
        return moment(this.get("date")).format("MMM DD, YYYY - HH:mm:ss")
    }
};

module.exports = Log;

belongsTo 关系正常工作,但是当我尝试 hasMany 时,我得到:"Unhandled rejection Error: A valid target model must be defined for the sessions hasMany relation" 错误。

我看过 https://github.com/tgriesser/bookshelf/wiki/Plugin:-Model-Registry 但它是使用 ES5 之前的语法完成的。

我想我需要确保 "Log" class 在指定 hasMany 关系之前可用但卡在这里。

有什么想法吗?

编辑:做

logs() {
    var log = require("./Log");
    return this.hasMany(log);
}

有效,但看起来很糟糕。

您可以使用 Bookshelf 注册表。它完全符合您的需求。

您可以像这样加载 Bookshelf 注册表插件:

const knex = require('knex')({
    client: 'pg',
    connection: {
        host: config.db_host,
        user: config.db_user, // user name for your database
        password: config.db_password, // user password
        database: config.db_database, // database name
        charset: 'utf8',
    },
});

const bookshelf = require('bookshelf')(knex);
bookshelf.plugin('registry');

module.exports = {
    knex,
    bookshelf,
};

然后,像这样在 module.exports 中注册您的模型:

module.exports = {
    session: db.bookshelf.model('Session', Session),
    log: db.bookshelf.model('Log', Log),
    db,
};