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

标签 node.js sqlite sequelize.js

我对 nodejs 开发有点陌生,所以这可能是一个简单的问题。我正在构建一个基于 express + sequelize 的典型网络应用程序。我正在内存中使用 sqlite,因为我现在只是在制作原型(prototype)。我知道如果我要使用持久的 sqlite 文件,这可能不是问题,但这不是我目前的目标。请考虑以下事项:

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

sequelize.sync();

User.build({
    "username": "mykospark"
});

起初,我在 User.build() 上收到关于用户表尚不存在的错误。我意识到 sequelize.sync() 被称为异步,并且插入发生在创建表之前。然后我重新安排了我的代码,以便 User.build() 调用在 sequelize.sync().complete() 内部,这解决了问题,但我不确定如何将它应用到我的项目的其余部分。

我的项目在很多不同的地方使用模型。据我了解,我只想在定义模型后调用 sequelize.sync() 一次,然后可以自由使用它们。我可能会找到一些方法来阻止整个 nodejs 应用程序,直到 sequelize.sync() 完成,但这似乎不是很好的形式。我想我可以将每个模型操作包装到一个 sequelize.sync().complete() 调用中,但这似乎也不对。

那么人们通常如何处理这个问题呢?

最佳答案

您的 .sync() 调用应该在您的 app.js 文件中调用一次。但是,如果您在一台服务器中管理多个数据库,则可能会有其他调用。通常,您的 .sync() 调用将在您的服务器文件中,而 var User = sequelize.define("ModelName"... 将在您的模型/模型名称中。 js 文件。Sequelize 建议这种类型的指导“创建一个可维护的应用程序,其中数据库逻辑收集在模型文件夹中”。这将随着您的开发增长而提供帮助。稍后在答案中,我将提供一个简单的步骤来遵循用于初始化文件结构。

因此对于您的情况,您将拥有 app.js、models/index.js 和 models/users.js。 app.js 将是运行 .sync() 方法的服务器。在模型文件夹中,您将拥有所需的 index.js 文件夹,您可以在其中配置与数据库的连接并收集所有模型定义。最后,您有了 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 --> See here

编辑 2017 年 3 月 14 日

现在,使用 sequelize 设置 Node 应用程序的最佳选择是使用 sequelize-cli。这是 sequelize 迁移,在开发和生产环境中具有非常有用的功能。对于这个问题的范围和对答案的修改,最好的方法如下:

npm install sequelize-cli

如果你想全局安装它,请使用 npm install sequelize-cli -g

然后初始化sequelize迁移:

sequelize init

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

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

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

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 并为您的数据库定义新模型以访问该模型的正确路径。这是一个例子:

models/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;

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

postgresInit.sh

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

如果您更喜欢 javascript 解决方案,这里有一个 SO 解决方案 here

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){});

关于node.js - 如何处理先调用 sequelize.sync()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24420800/

相关文章:

java - 从一个类调用另一个类的方法

SQLite - 在具有多个潜在中间关系的 2 个表之间聚合相关数据(树状)

javascript - 如何根据每个客户端动态连接mysql数据库?

sql - 创建一个数据库来存储模块名称及其 parent_module_id

javascript - 如何在 JavaScript 中通过 MySQL 建立多对多关系?

node.js - json数组中的 Node 分页

node.js - 无法在 Docker 中编译 typescript

javascript - 对于 Node Js Server 如何引用不同文件夹中的静态 html 文件

node.js - Winston 没有记录任何日志级别,可能是什么错误?

iphone - 在应用程序中传送预填充的 SQLite 数据库。启动时数据库的路径