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

时间:2016-05-10 14:12:40

标签: node.js sequelize.js sequelize-cli

我一直在与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.

2 个答案:

答案 0 :(得分:0)

由于我仍然无法使其正常工作,我现在发布我使用的解决方案,该解决方案工作得很好,但是是自定义的。

首先,我创建了一个包含我想要种子的对象的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);
}

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

我希望这对你们有所帮助。

答案 1 :(得分:0)

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

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