如何处理先调用sequelize.sync()?

我在nodejs中开发有点新,所以这可能是一个简单的问题。 我正在build立一个典型的Web应用程序基于快递+续订。 我在内存中使用sqlite,因为我现在只是原型。 我明白,如果我要使用持续的sqlite文件,这可能不是一个问题,但这不是我目前的目标。 考虑以下:

var User = sequelize.define("User", { "username": DataTypes.STRING, // etc, etc, etc }); sequelize.sync(); User.build({ "username": "mykospark" }); 

起初,我在User.build()方面得到了关于Users表不存在的错误。 我意识到sequelize.sync()被称为asynchronous,插入发生在表创build之前。 然后,我重新安排我的代码,以便User.build()调用是在sequelize.sync()。complete()修复问题,但我不知道如何将其应用到我的项目的其余部分。

我的项目在一堆不同的地方使用模型。 这是我的理解,我只是想在我的模型定义后调用sequelize.sync()一次,然后他们可以自由使用。 我可能会find一些方法来阻止整个nodejs应用程序,直到sequelize.sync()完成,但这似乎不是好的forms。 我想我可以将每一个模型操作包装到sequelize.sync()。complete()调用中,但是这看起来不正确。

那么人们通常如何处理呢?

您的.sync()调用应该在您的app.js文件中调用一次。 但是,如果您在一台服务器中pipe理多个数据库,则可能会有其他调用。 通常你的.sync()调用将会在你的服务器文件中,并且var User = sequelize.define("ModelName"...将会在你的models / modelName.js文件中.Sequelizebuild议这种types的指导来“创build可维护的在模型文件夹中收集数据库逻辑的应用程序“,随着开发的不断发展,这将对您有所帮助,在后面的答案中,我将提供一个简单的步骤来初始化文件结构。

所以对于你的情况,你会有app.js,models / index.js和models / users.js。 其中app.js将是您的服务器运行.sync()方法。 在模型文件夹中,您将拥有所需的index.js文件夹,您可以在其中configuration到数据库的连接并收集所有模型定义。 最后,你有你的user.js文件,你添加你的模型与类和实例方法。 下面是models / user.js文件的示例,您可能会发现它有帮助。

user.js的

  module.exports = function(sequelize, DataTypes) { return sequelize.define('User', { username: DataTypes.STRING, },{ classMethods: { doSomething: function(successcb, errcb, request) {} }, instanceMethods: { someThingElse: function(successcb, errcb, request) {} } }); }; 

models / index.js – > 见这里

编辑 03/14/17

现在最好的select来设置节点应用程序的续集是使用sequelize-cli。 这是对迁移的补充,在开发和生产环境中具有非常有用的function。 对于这个问题的范围和对答案的修改,最好的办法如下:

 npm install sequelize-cli 

如果您希望全局npm install sequelize-cli -g请使用npm install sequelize-cli -g

然后初始化后续迁移:

 sequelize init 

它应该在您启动命令的文件夹中安装以下文件夹和文件结构:

 config: -config.json models: -index.js seeders: migrations: 

如果你想创build一个模型,你可以运行下面的命令,它会自动为你生成文件结构。 这是一个例子

sequelize model:create --name User --attributes "user:string email:string"

接下来,您应该能够在models / page.js中看到新的模型page

  config: -config.json models: -index.js -user.js -page.js seeders: migrations: 

您将需要进入models / index.js并为数据库定义新的模型,以访问该模型的正确path。 这里是一个例子:

车型/ index.js

 var sq = new Sequelize(dbname, user, password, config); db = { Sequelize: Sequelize, sequelize: sq, page: sq.import(__dirname + '/page.js'), user: sq.import(__dirname + '/user.js') } module.exports = db; 

如果您需要对模型进行更改,则可以进入迁移文件夹并添加方法。 请按照此处的续集迁移文档。 现在,关于app.js服务器。 在运行服务器之前,您需要初始化数据库。 在运行服务器以设置postgres数据库之前,我使用以下脚本来初始化数据库:

postgresInit.sh

 [...] `sudo -u postgres createdb -U postgres -O $PG_USER $PG_DB. ` 

如果你喜欢javascript解决scheme,这里有一个SO解决scheme

app.js

 [...] console.log('this will sync your table to your database') console.log('and the console should read out Executing (default): CREATE TABLE IF NOT EXISTS "TABLE NAME"....') db.sequelize.sync(function(err){});