簡體   English   中英

為什么 Setup 中的命令這么難?

[英]Why is the order in the Setup so hard?

我基於庫中包含的 node-orm2 示例項目構建了一個 node express 應用程序。 我有一個討厭的“錯誤”,我的返回值看起來一團糟。

一個“用戶”只有一個“權限”: User.hasOne('permission', db.models.permission, {required: true, autoFetch: true}); 一個“公司”有一個所有者,但反過來,一個“用戶”有多個“公司”。 Company.hasOne('user', db.models.user, { required: true, reverse: 'companies', autoFetch: true});

第一次設置:

function setup(db, cb) {
 require('./company')(orm, db);
 require('./user')(orm, db);
 require('./permission')(orm, db);

 return cb(null, db);
}

亂七八糟的結果:

{
  "id": 1,
  "username": "l.vanbuiten",
  "name": "Lex",
  "surname": "van Buiten",
  "age": "1992-05-13T22:00:00.000Z",
  "createdAt": "2015-12-21T23:25:04.000Z",
  "permission": {
    "id": 1,
    "username": "l.vanbuiten",
    "name": "Lex",
    "surname": "van Buiten",
    "age": "1992-05-13T22:00:00.000Z",
    "createdAt": "2015-12-21T23:25:04.000Z",
    "permission_id": 1
  },
  "companies": []
}

交換這些設置行后,事情如我所願:

應該如何:

function setup(db, cb) {
 require('./permission')(orm, db);
 require('./user')(orm, db);
 require('./company')(orm, db);

 return cb(null, db);
}

想要的結果

{
  "id": 1,
  "username": "l.vanbuiten",
  "name": "Lex",
  "surname": "van Buiten",
  "age": "1992-05-13T22:00:00.000Z",
  "createdAt": "2015-12-21T23:25:04.000Z",
  "permission": {
    "id": 1,
    "name": "permission name"
  },
  "companies": [
    {
      "id": 1,
      "name": "company name",
      "description": "company description",
      "createdAt": "2015-12-21T23:25:25.000Z"
    }
  ]
}

一個示例模型:

var moment = require('moment');

module.exports = function (orm, db) {
var Company = db.define('company', {
    id:             {type: 'serial', key: true},
    name:           {type: 'text', required: true, unique: true},
    description:    {type: 'text', big: true},
    createdAt:  {type: 'date', required: true, time: true}
},
{
    cache: false,
    hooks: {
        beforeValidation: function () {
            this.createdAt = new Date();
        }
    },
    validations: {
        name: [
            orm.enforce.unique("Company already exist"),
            orm.enforce.ranges.length(1, undefined, "Company name cannot be empty"),
            orm.enforce.ranges.length(undefined, 50, "Company name is to long")
        ]
    },
    methods: {
        serialize: function () {
            return {
                id: this.id,
                name: this.name,
                description: this.description,
                createdAt: this.createdAt
            }
        }
    }
});
Company.hasOne('user', db.models.user, { required: true, reverse: 'companies', autoFetch: true});
};

順序怎么相差這么大?

(免責聲明:我沒有很多node-orm2經驗)

在我看來,您設置關聯的方式導致了您的問題。

在您的第一次設置中,您定義模型和關聯的順序如下:

  • 創建Company模式
  • 通過db.models.user (尚不存在!)創建CompanyUser之間的關聯
  • 創建User模型
  • 等等。

相反,我認為您必須等到所有模型都已定義后才能創建關聯:

function setup(db, cb) {
  // Create models.
  var Permission = require('./permission')(orm, db);
  var User       = require('./user')(orm, db);
  var Company    = require('./company')(orm, db);

  // Create associations.
  Company.hasOne('user', User, { required: true, reverse: 'companies', autoFetch: true});
  ...

  // Return.
  return cb(null, db);
}

(這也假設每個所需模型文件中的導出函數返回模型,例如在company.js末尾return Company )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM