Node.js 带有 Sequelize 的数据库模块
Node.js Database Module with Sequelize
为了使我的代码更具可读性,我试图将所有与数据库相关的代码移动到一个文件中。并将 Sequelize 用作 ORM。我希望这个文件在包含时提供一个随时可用的数据库。表模式也由 Sequelize 管理,这就是我使用 sync()
方法在第一个 运行 上创建 table 的原因。不幸的是,当我第一次 运行 应用程序时,我得到一个错误,在使用此代码时 table 不存在:
文件:test.js
const database = require('./dbInit');
(async () => {
await database.testTable.max('id').then((maxId) => {
console.log(maxId);
});
})();
文件:dbInit.js
const Sequelize = require('sequelize');
const sequelize = new Sequelize('mysql://root:root@localhost:3306/test');
const testTable = sequelize.import('testTable');
const database = {
sequelize: sequelize,
testTable: testTable,
};
sequelize
.authenticate()
.then(() => {
console.log('Connection to the database has been established successfully.');
})
.catch(error => {
console.error(error);
});
sequelize.sync();
module.exports = database;
文件:testTable.js
const Sequelize = require('sequelize');
module.exports = (sequelize, DataTypes) => {
return sequelize.define('testTable',
{
id: {
type: Sequelize.BIGINT(19).UNSIGNED,
primaryKey: true,
autoIncrement: false,
}
}
);
};
当我按原样 运行 代码时,没有创建 tables,我可以从日志中看到查询是 运行 在数据库连接可用之前:
> node .\test.js
Executing (default): SELECT 1+1 AS result
Executing (default): SELECT max(`id`) AS `max` FROM `testTables` AS `testTable`;
Connection to the database has been established successfully.
(node:1572) UnhandledPromiseRejectionWarning: SequelizeDatabaseError: Table 'test.testtables' doesn't exist
我找到了一种方法,通过在调用数据库之前(在 max('id')
调用之前的 test.js 中添加这样的代码来使其工作:
await database.sequelize.sync();
是否有任何其他方法可以使 dbInit 模块完全独立,而不必在所有其他需要数据库连接的文件中添加此 sync()
调用?
我一直在寻找同步模块加载,但它似乎还不是一个选项。
由于您想要执行的所有操作的异步行为:
- 连接
- 同步
- 做数据库操作
您必须按照以下方式完成:
将模型文件放入:db
文件夹为:db/schemas/User.js
并为数据库制作模块文件:db/index.js
const Sequelize = require('sequelize');
const sequelize = new Sequelize('mysql://root:root@localhost:3306/test');
const connect = async () => {
try {
await sequelize.authenticate();
await sequelize.sync();
console.log('Connection to the database has been established successfully.');
}
catch (error) {
console.error(error.message);
process.exit(-1);
}
});
const model = name => database.models[name];
const User = sequelize.import('./schemas/User');
const database = {
sequelize: sequelize,
models: {User},
connect,
model
};
module.exports = database;
并在 test.js
中:
const db = require('./db');
(async () => {
await db.connect();
const User = db.model('User');
const id = await User.max('id');
console.log(id);
})();
P.S。当开发人员不关心 db 何时连接以及 express app 何时监听端口时,请忘记 Web 应用程序中使用的示例。
您的问题不同 - 您希望立即进行数据库查询,因此您必须确保连接和同步已成功建立。
您可以跟进我的 github 回购 Sequelize-DemoApp。它是一个功能齐全的全栈应用程序,专门用于演示和理解 Sequelize.js 并且它与 nodejs
集成
为了使我的代码更具可读性,我试图将所有与数据库相关的代码移动到一个文件中。并将 Sequelize 用作 ORM。我希望这个文件在包含时提供一个随时可用的数据库。表模式也由 Sequelize 管理,这就是我使用 sync()
方法在第一个 运行 上创建 table 的原因。不幸的是,当我第一次 运行 应用程序时,我得到一个错误,在使用此代码时 table 不存在:
文件:test.js
const database = require('./dbInit');
(async () => {
await database.testTable.max('id').then((maxId) => {
console.log(maxId);
});
})();
文件:dbInit.js
const Sequelize = require('sequelize');
const sequelize = new Sequelize('mysql://root:root@localhost:3306/test');
const testTable = sequelize.import('testTable');
const database = {
sequelize: sequelize,
testTable: testTable,
};
sequelize
.authenticate()
.then(() => {
console.log('Connection to the database has been established successfully.');
})
.catch(error => {
console.error(error);
});
sequelize.sync();
module.exports = database;
文件:testTable.js
const Sequelize = require('sequelize');
module.exports = (sequelize, DataTypes) => {
return sequelize.define('testTable',
{
id: {
type: Sequelize.BIGINT(19).UNSIGNED,
primaryKey: true,
autoIncrement: false,
}
}
);
};
当我按原样 运行 代码时,没有创建 tables,我可以从日志中看到查询是 运行 在数据库连接可用之前:
> node .\test.js
Executing (default): SELECT 1+1 AS result
Executing (default): SELECT max(`id`) AS `max` FROM `testTables` AS `testTable`;
Connection to the database has been established successfully.
(node:1572) UnhandledPromiseRejectionWarning: SequelizeDatabaseError: Table 'test.testtables' doesn't exist
我找到了一种方法,通过在调用数据库之前(在 max('id')
调用之前的 test.js 中添加这样的代码来使其工作:
await database.sequelize.sync();
是否有任何其他方法可以使 dbInit 模块完全独立,而不必在所有其他需要数据库连接的文件中添加此 sync()
调用?
我一直在寻找同步模块加载,但它似乎还不是一个选项。
由于您想要执行的所有操作的异步行为:
- 连接
- 同步
- 做数据库操作
您必须按照以下方式完成:
将模型文件放入:db
文件夹为:db/schemas/User.js
并为数据库制作模块文件:db/index.js
const Sequelize = require('sequelize');
const sequelize = new Sequelize('mysql://root:root@localhost:3306/test');
const connect = async () => {
try {
await sequelize.authenticate();
await sequelize.sync();
console.log('Connection to the database has been established successfully.');
}
catch (error) {
console.error(error.message);
process.exit(-1);
}
});
const model = name => database.models[name];
const User = sequelize.import('./schemas/User');
const database = {
sequelize: sequelize,
models: {User},
connect,
model
};
module.exports = database;
并在 test.js
中:
const db = require('./db');
(async () => {
await db.connect();
const User = db.model('User');
const id = await User.max('id');
console.log(id);
})();
P.S。当开发人员不关心 db 何时连接以及 express app 何时监听端口时,请忘记 Web 应用程序中使用的示例。 您的问题不同 - 您希望立即进行数据库查询,因此您必须确保连接和同步已成功建立。
您可以跟进我的 github 回购 Sequelize-DemoApp。它是一个功能齐全的全栈应用程序,专门用于演示和理解 Sequelize.js 并且它与 nodejs
集成