使用Node.js进行Sequelize的可扩展种子设定?

时间:2017-11-16 09:07:43

标签: node.js promise sequelize.js seed seeding

我想设置一段代码来重置我的整个数据库并为所有内容提供种子。

问题在于,只有一些外键约束,种子需要按顺序发生,但是那些不依赖的种子应该异步同时发生。

如何在单独的文件中正确定义这些种子?

1 个答案:

答案 0 :(得分:0)

问题归结为使用module.exports导出Promises。

当我要求一个直接返回Promise的文件时,会立即调用Promise 我通过返回返回Promise的函数解决了这个问题。

Resetting DB and seeding

const Seed = require('../seeds/index');

sequelize.sync({ force: true }).then(() => {
    return Seed();
}).then(() => {
    // DB reset
}).catch(err => {
    // Error in one of the seeds, specific error in 'err'
});


seeds/index.js - 在其他文件中调用种子

const UserSeed = require('./user');
const BComponentSeed = require('./bcomponent');
const MaterialSeed = require('./material');

module.exports = function() {
    return Promise.all([ // Returning and thus passing a Promise here
        // Independent seeds first
        UserSeed(),
        BComponentSeed(),
        MaterialSeed(),
    ]).then(() => {
        // More seeds that require IDs from the seeds above
    }).then(() => {
        console.log('********** Successfully seeded db **********');
    });
}


seeds/user.js - 用户种子的示例

const User = require('../models/user');
const crypto = require('../globs/crypto');

module.exports = function() {
    return User.bulkCreate([ // Returning and thus passing a Promise here
        {
            email: 'John@doe.com',
            password: crypto.generateHash('john'),
        },
        {
            email: 'a@a.com',
            password: crypto.generateHash('a'),
        },
    ]);
};


在回复this GitHub issue

时想出了这个