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'
}
]
我已经为 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'
}
]