在 Node/Express 中续集 - “没有这样的表:main.User”错误
Posted
技术标签:
【中文标题】在 Node/Express 中续集 - “没有这样的表:main.User”错误【英文标题】:Sequelize in Node/Express - 'no such table: main.User` error 【发布时间】:2017-05-24 05:42:17 【问题描述】:我正在尝试使用 Sequelize 构建一个简单的 Node/Express 应用程序,但是当我尝试在我的关系数据库中创建新记录时,我收到了错误 Unhandled rejection SequelizeDatabaseError: SQLITE_ERROR: no such table: main.User
。基本上,我在Users
表中创建一个用户,然后尝试在Addresses
表中创建一个相关地址 - 用户已成功创建,但在创建地址时失败并出现此错误......它在哪里得到main
来自表名的前缀? (下面的完整错误读数)...
首先,这是我的程序的概要...
我的 Sequelize 版本是 Sequelize [Node: 6.8.1, CLI: 2.4.0, ORM: 3.29.0]
,我使用 Sequelize CLI 命令sequelize init
来设置我项目的这一部分。
我正在使用 SQLite3 进行本地开发,并且在 config/config.json
我将开发数据库定义为
"development":
"storage": "dev.sqlite",
"dialect": "sqlite"
我的用户迁移:
'use strict';
module.exports =
up: function(queryInterface, Sequelize)
return queryInterface.createTable('Users',
id:
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
,
first_name:
type: Sequelize.STRING
,
last_name:
type: Sequelize.STRING
,
createdAt:
allowNull: false,
type: Sequelize.DATE
,
updatedAt:
allowNull: false,
type: Sequelize.DATE
);
,
down: function(queryInterface, Sequelize)
return queryInterface.dropTable('Users');
;
及地址迁移(略):
module.exports =
up: function(queryInterface, Sequelize)
return queryInterface.createTable('Addresses',
id:
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
,
address_line_one:
type: Sequelize.STRING
,
UserId:
type: Sequelize.INTEGER,
allowNull: false,
references:
model: "User",
key: "id"
)
用户模型:
'use strict';
module.exports = function(sequelize, DataTypes)
var User = sequelize.define('User',
first_name: DataTypes.STRING,
last_name: DataTypes.STRING
,
classMethods:
associate: function(models)
models.User.hasOne(models.Address);
);
return User;
;
和地址模型:
'use strict';
module.exports = function(sequelize, DataTypes)
var Address = sequelize.define('Address',
address_line_one: DataTypes.STRING,
UserId: DataTypes.INTEGER
,
classMethods:
associate: function(models)
models.Address.hasOne(models.Geometry);
models.Address.belongsTo(models.User,
onDelete: "CASCADE",
foreignKey:
allowNull: false
);
);
return Address;
;
最后,我的路线index.js
:
router.post('/createUser', function(req, res)
var firstName = req.body.first_name;
var lastName = req.body.last_name;
var addressLineOne = req.body.address_line_one;
models.User.create(
'first_name': newUser.firstName,
'last_name': newUser.lastName
).then(function(user)
return user.createAddress(
'address_line_one': newUser.addressLineOne
)
)
所以当我尝试发布到/createUser
时,将成功创建用户,并且控制台会说已创建新地址(INSERT INTO 'Addresses'...
),但未创建地址并记录以下错误:
Unhandled rejection SequelizeDatabaseError: SQLITE_ERROR: no such table: main.User
at Query.formatError (/Users/darrenklein/Desktop/Darren/NYCDA/WDI/projects/world_table/wt_test_app_1/node_modules/sequelize/lib/dialects/sqlite/query.js:348:14)
at afterExecute (/Users/darrenklein/Desktop/Darren/NYCDA/WDI/projects/world_table/wt_test_app_1/node_modules/sequelize/lib/dialects/sqlite/query.js:112:29)
at Statement.errBack (/Users/darrenklein/Desktop/Darren/NYCDA/WDI/projects/world_table/wt_test_app_1/node_modules/sqlite3/lib/sqlite3.js:16:21)
几个月前我用 Sequelize 做过一次这样的事情,它很成功,我一生都无法弄清楚我在这里缺少什么。为什么应用程序在寻找main.User
,我怎样才能让它寻找正确的表格?谢谢!
【问题讨论】:
【参考方案1】:啊哈!一个小错误使我的整个操作脱轨。在迁移文件中,references.model
必须是复数形式!
references:
model: "Users",
key: "id"
轰隆隆。
【讨论】:
如果你不想担心复数,你可以在你的表中添加选项:'freezeTableName: true' @R.Gulbrandsen 太棒了!以上是关于在 Node/Express 中续集 - “没有这样的表:main.User”错误的主要内容,如果未能解决你的问题,请参考以下文章
Node.js - Express.js JWT 总是在浏览器响应中返回一个无效的令牌错误
在 JWT 中存储秘密信息,使用 Node.js - Express 后端