Sequelize-CLI 播种机 - 无法读取未定义的 属性

Sequelize-CLI Seeders - Cannot read property of undefined

我已经为 db:seed:all 苦苦挣扎了一个多小时,慢慢地我对此失去了理智。

我有一个简单的模型:

'use strict';
module.exports = function (sequelize, DataTypes) {
  var Car = sequelize.define('Cars', {
    name: DataTypes.STRING,
    type: DataTypes.INTEGER,
    models: DataTypes.INTEGER
  }, {
      classMethods: {
        associate: function (models) {
          // associations can be defined here
        }
      }
    });
  return Car;
};

这是在迁移中,使用 sequelize db:migrate 进入数据库,效果很好。

接下来我想通过种子文件插入 2 辆汽车。 所以我 运行 命令 sequelize seed:create --name insertCars 并添加了 bulkInsert:

'use strict';

module.exports = {
  up: function (queryInterface, Sequelize) {
    return queryInterface.bulkInsert(
      'Cars',
      [
        {
          name: "Auris",
          type: 1,
          models: 500,
          createdAt: Date.now(), updatedAt: Date.now()
        },
        {
          name: "Yaris",
          type: 1,
          models: 500,
          createdAt: Date.now(), updatedAt: Date.now()
        }
      ]
    );
  },

  down: function (queryInterface, Sequelize) {
  }
};

现在当我 运行 sequelize db:seed:all 我得到以下错误:

Loaded configuration file "config\config.json".
Using environment "development".
== 20160510132128-insertCars: migrating =======
Seed file failed with error: Cannot read property 'name' of undefined

有没有人有过使用这些播种机的经验?运行 这里是我的配置文件供您参考:

{
  "development": {
    "username": "mydbdude",
    "password": "mydbdude",
    "database": "Cars",
    "host": "127.0.0.1",
    "dialect": "mssql",
    "development": {
      "autoMigrateOldSchema": true
    }
  },
  ....other configs
}

编辑:来自db:migrate

的输出
Sequelize [Node: 5.9.1, CLI: 2.4.0, ORM: 3.23.0]

Loaded configuration file "config\config.json".
Using environment "development".
No migrations were executed, database schema was already up to date.

由于我仍然无法使它正常工作,所以我现在 post 我使用的解决方案效果很好,但是是定制的。

首先,我创建了一个 JSON 文件,其中包含我要播种的对象。 即

dataSources: [
    {
        name: 'Pattern'
    },
    {
        name: 'Upload'
    }
]

接下来,我在我的应用程序的服务器端实现了一个 seeder.js,其中包含以下内容(当然是精简版)

var models = require('./../models'),
sql = models.sequelize,
Promise = models.Sequelize.Promise;

var objects = require('./seed/objects'), //this is where my object file is
dataSources = objects.dataSources;


var express = require('express');

var seedDatabase = function () {
    var promises = [];
    promises.push(createDataSources());
    //more can be added to the promises

    return Promise.all(promises);
};

function createDataSources() {
    return models.sequelize
        .transaction(
            {
                isolationLevel: models.sequelize.Transaction.ISOLATION_LEVELS.READ_COMMITTED
            },
            function (t) {
                return models.DataSource
                    .findAll({
                        attributes: [
                            'id'
                        ]
                    })
                    .then(function (result) {
                        if (!result || result.length == 0) {
                            return models.DataSource
                                .bulkCreate(dataSources, { transaction: t })
                                .then(function () {
                                    console.log("DataSources created");
                                })
                        }
                        else {
                            console.log("DataSources seeder skipped, already objects in the database...");
                            return;
                        }
                    });
            })
        .then(function (result) {
            console.log("DataSources seeder finished...");
            return;
        })
        .catch(function (error) {
            console.log("DataSources seeder exited with error: " + error.message);
            return;
        });
};

module.exports = {
    seedDatabase: seedDatabase
}

现在所有这些设置都已完成,我可以在我的应用程序启动时使用这个 seedDatabase 函数来 运行 我的播种器,就像这样:

//includes and routes above, not interesting for this answer
try {
    umzug.up().then(function (migrations) {
        for (var i = 0; i < migrations.length; i++) {
            console.log("Migration executed: " + migrations[i].file);
        }

        console.log("Running seeder");
        seeder.seedDatabase().then(function () { //here I run my seeders
            app.listen(app.get('port'), function () {
                console.log('Express server listening on port ' + app.get('port'));
            });
        });
    });
}
catch (e) {
    console.error(e);
}

就是这样,现在,当您 运行 您的应用程序时,播种器将检查数据库是否已将您的任何对象插入到数据库中。如果有,则跳过播种机,如果没有,则插入。

希望对大家有所帮助。

我遇到了同样的问题,问题是我在对象之间添加了额外的逗号,检查是否存在可能有效的语法错误

 dataSources: [
    {
        name: 'Pattern'
    },
    ,// this comma was added by mistake for me
    {
        name: 'Upload'
    }
 ]