在 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+express框架中连接使用mysql经验总结

在 Node/Express 的异步函数中捕获错误

Node.js - Express.js JWT 总是在浏览器响应中返回一个无效的令牌错误

在 JWT 中存储秘密信息,使用 Node.js - Express 后端

AWS Cognito 可以在 EB 上的 Node/Express/React 应用程序中使用吗?

如何在 Node/Express 中使用 CAC 对用户进行身份验证