Nic*_*tte 5 javascript require node.js async-await sequelize.js
为了使代码更具可读性,我正在尝试将所有与数据库相关的代码移动到一个文件中。并使用Sequelize作为ORM。我希望该文件(如果包含)提供一个随时可用的数据库。表架构也由Sequelize管理,这就是为什么我sync()在第一次运行时使用该方法创建表的原因。不幸的是,当我第一次运行该应用程序时,使用以下代码时出现错误:该表不存在:
档案:test.js
const database = require('./dbInit');
(async () => {
await database.testTable.max('id').then((maxId) => {
console.log(maxId);
});
})();
Run Code Online (Sandbox Code Playgroud)
文件: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;
Run Code Online (Sandbox Code Playgroud)
文件:testTable.js
const Sequelize = require('sequelize');
module.exports = (sequelize, DataTypes) => {
return sequelize.define('testTable',
{
id: {
type: Sequelize.BIGINT(19).UNSIGNED,
primaryKey: true,
autoIncrement: false,
}
}
);
};
Run Code Online (Sandbox Code Playgroud)
当我按原样运行代码而未创建表时,从日志中可以看到在与数据库的连接可用之前查询已运行:
> 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
Run Code Online (Sandbox Code Playgroud)
我找到了一种方法,可以在调用数据库之前(在调用之前在test.js中max('id'))添加如下代码:
await database.sequelize.sync();
Run Code Online (Sandbox Code Playgroud)
还有其他方法可以使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;
Run Code Online (Sandbox Code Playgroud)
并在test.js:
const db = require('./db');
(async () => {
await db.connect();
const User = db.model('User');
const id = await User.max('id');
console.log(id);
})();
Run Code Online (Sandbox Code Playgroud)
PS 忘记在 Web 应用程序中使用的示例,因为开发人员不关心数据库何时连接以及 Express 应用程序何时侦听端口。你的问题是不同的 - 你想立即进行数据库查询,所以你必须确保连接和同步建立成功。
| 归档时间: |
|
| 查看次数: |
1065 次 |
| 最近记录: |