我对 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/