我正在学习node.js和sequelizer,我遇到了一个问题,即我创建了一个用户模型使用sequelizer,不幸的是,当我想运行在index.js sequelizer. sync();它在控制台中显示结果,但不创建表。
我的模特:
const Sequelize = require('sequelize');
const sequelize = require('../util/database');
const User = sequelize.define('user', {
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
allowNull: false,
primaryKey: true
},
name: {
type: Sequelize.TEXT,
allowNull: false
},
surname: {
type: Sequelize.TEXT,
allowNull: false
}
});
module.exports = User;
我的数据库配置
const Sequelize = require('sequelize');
const sequelize = new Sequelize('node-nauka', 'root', '', {
dialect: 'mysql',
host: 'localhost'
});
module.exports = sequelize;
index.js
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const defaultRoutes = require('./routes/default');
const sequelize = require('./util/database');
app.use(bodyParser.json());
app.use(defaultRoutes);
sequelize.sync().then(result => {
console.log(result);
app.listen(3000);
}).catch(err => {
console.log(err);
});
同步结果:https://pastebin.com/rtxqkMtx我很怀念的想法,在几个数据库上试了一下,效果一样,没有错误而且也不创建表。
9条答案
按热度按时间u4vypkhs1#
在我的例子中,我只是将Model导入app.js
@PawelC你的代码和我的一样,所以它也会为你工作
谢啦,谢啦
ha5z0ras2#
首先,你没有给我们看你的
./routes/default
。你在那里使用你的模型了吗?如果没有,这里是错误。在pastebin的输出中,你可以看到:在路线中使用模型,您将看到:
第二,代码中的
require
有点像意大利面,例如,在index.js
中需要./util/database
,在./models/user
中需要./util/database
,因此flow为:因此,正如您所看到的,requires -
index.js
不知道您的模型的任何信息,Require是import语句,而不是代码注入。如果您将在工艺路线中使用模型,流程将为:
因此将存在从模型到
index.js
流。最终溶液
为了更全面,您可以将数据库配置和所有模型收集在一个集合中(大部分在
./models/index.js
中,因此您可以在require('./models')
之前获得它),并从该集合导入到sync()
和路由以使用它。第二个最佳实践是不要在主应用程序文件中使用sync()(对于您:
index.js
)。现在,当您开发时,它并不那么重要,但在生产环境中,它可能会破坏数据库中的数据(例如删除行)。更好的方法是将它用作迁移。您可以在我们的示例博客应用程序上看到此主题的示例:https://github.com/OptizeTeam/blog-api-node
8e2ybdfx3#
要解决此问题,请在您的控制台上安装sequelize-cli,然后执行以下步骤,
1.在控制台上运行npx sequelize init,它会生成一些文件夹,如config文件夹,models文件夹等。删除config文件夹,打开models -〉index.js,并按如下方式重构代码:
'
2.在创建模型的同一个模型文件夹中,请按以下方式重构模型创建代码
1.在index.js文件中
'
'
1.然后运行你的代码-〉npm start来创建你的表。谢谢。
3htmauhk4#
只需导入index.js中的用户模型文件。这将在数据库中创建表,因为除非节点读取该文件,否则它不知道表已创建。
q3aa05255#
我也在学习马克西米利安的Udemy课程,对我有效的是我创建了一个post请求(即使同步没有创建表),当我有了在一个post路由中创建条目的逻辑并启动节点服务器时,它自动创建了表。
ylamdve66#
我认为您的代码无法工作的原因是因为您没有从“models”文件夹导入的内容。Max在“controllers”文件夹的admin.js文件中有此导入:const Product =需要('.../型号/产品');通过这种方式,他将models文件夹链接到应用程序的其余部分,从而允许Sequelize找到他在“models”文件夹中定义的模型的配置。
如果您尝试将user.js中的所有代码移动到app.js或index.js中,然后尝试同步,您会发现这是可行的。
368yc8dk7#
在index.js中
导入模型。
例如:-
之后:-
代码如下所示:-
kiayqfof8#
确保代码以某种方式导入或通过其他文件连接到主应用程序。
例如,如果一个模型导入控制器,然后导入控制器的路线和路线导入app.js,然后也以这种方式工作...
zed5wv109#