node.js - 尝试访问小写 "users"而不是大写 "Users"的表名的 Sequelize 模型类

标签 node.js postgresql sequelize.js

我正在尝试使用 Sequelize model.create 函数,但一直遇到这个错误: Unhandled rejection SequelizeDatabaseError: relation "users" does not existUser 类使我的表名全部小写而不是大写。我创建的表名为“Users”,但 create 函数一直试图寻找名为“users”的表。Executing (default): SELECT "id", "first_name", "last_name", "email", "username", "password", "dob", "created_at" AS "createdAt", "updated_at" AS "updatedAt" FROM "users" AS "User";
似乎 User 类在与 postgres 通信时试图访问“用户”表。我尝试使用其他功能并不断遇到同样的问题。我的代码在下面。
/model/index.js

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../../config/db.js')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
    sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
    sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
    .readdirSync(__dirname)
    .filter(file => {
        return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
    })
    .forEach(file => {
        const model = sequelize['import'](path.join(__dirname, file));
        db[model.name] = model;
    });

Object.keys(db).forEach(modelName => {
    if (db[modelName].associate) {
        db[modelName].associate(db);
    }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

/model/users.js
'use strict';

const bcrypt = require('bcrypt');

module.exports = (sequelize, DataTypes) => {
    const User = sequelize.define('User', {
        first_name: {
            type: DataTypes.STRING,
            allowNull: false,
            unique: true
        },
        last_name: {
            type: DataTypes.STRING,
            allowNull: false
        },
        email: {
            type: DataTypes.STRING,
            allowNull: false,
            unique: true
        },
        username: {
            type: DataTypes.STRING,
            allowNull: false,
            unique: true
        },
        password: {
            type: DataTypes.STRING,
            allowNull: false
        },
        dob: {
            type: DataTypes.DATE,
            allowNull: false
        }
    }, {
        underscored: true,
        instanceMethods: {
            validPassword(password) {
                return bcrypt.compareSync(password, this.password);
            }
        }
    });

    User.beforeCreate((user) => {
        user.email = user.email.toLowerCase();
        user.first_name = user.first_name.charAt(0).toUpperCase(0) + user.first_name.slice(1);
        user.last_name = user.last_name.charAt(0).toUpperCase(0) + user.last_name.slice(1);
        return bcrypt.hash(user.password, 8).then((hash) => {
            user.password = hash;
        });
    });

    User.associate = function(models) {
        // associations can be defined here
    };
    return User;
};
/migrations/20191025125151-create-user.js
'use strict';
module.exports = {
    up: (queryInterface, Sequelize) => {
        return queryInterface.createTable('Users', {
            id: {
                allowNull: false,
                autoIncrement: true,
                primaryKey: true,
                type: Sequelize.INTEGER
            },
            first_name: {
                type: Sequelize.STRING,
                allowNull: false
            },
            last_name: {
                type: Sequelize.STRING,
                allowNull: false
            },
            email: {
                type: Sequelize.STRING,
                allowNull: false,
                unique: true
            },
            username: {
                type: Sequelize.STRING,
                allowNull: false,
                unique: true
            },
            password: {
                type: Sequelize.STRING,
                allowNull: false
            },
            dob: {
                type: Sequelize.DATE,
                allowNull: false
            },
            created_at: {
                allowNull: false,
                type: Sequelize.DATE,
                defaultValue: Sequelize.literal('NOW()')
            },
            updated_at: {
                allowNull: false,
                type: Sequelize.DATE,
                defaultValue: Sequelize.literal('NOW()')
            }
        }, {
            timestamps: true,
            underscored: true
        });
    },
    down: (queryInterface, Sequelize) => {
        return queryInterface.dropTable('Users');
    }
};
/controllers/user
const { User } = require('../../db/models');

const signup = (req, res) => {
    const { first_name, last_name, username, email, password, dob } = req.swagger.params.data.value;
    User.create({
        first_name,
        last_name,
        password,
        dob,
        username,
        email
    })
        .then((user) => {
            console.log(user);
            res.json({message: 'Success'});
        })
}

错误信息:
Executing (default): SELECT "id", "first_name", "last_name", "email", "username", "password", "dob", "created_at" AS "createdAt", "updated_at" AS "updatedAt" FROM "users" AS "User";
Unhandled rejection SequelizeDatabaseError: relation "users" does not exist
    at Query.formatError (/home/ubu/projects/stat/node_modules/sequelize/lib/dialects/postgres/query.js:366:16)
    at query.catch.err (/home/ubu/projects/stat/node_modules/sequelize/lib/dialects/postgres/query.js:72:18)
    at bound (domain.js:301:14)
    at runBound (domain.js:314:12)
    at tryCatcher (/home/ubu/projects/stat/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/home/ubu/projects/stat/node_modules/bluebird/js/release/promise.js:547:31)
    at Promise._settlePromise (/home/ubu/projects/stat/node_modules/bluebird/js/release/promise.js:604:18)
    at Promise._settlePromise0 (/home/ubu/projects/stat/node_modules/bluebird/js/release/promise.js:649:10)
    at Promise._settlePromises (/home/ubu/projects/stat/node_modules/bluebird/js/release/promise.js:725:18)
    at _drainQueueStep (/home/ubu/projects/stat/node_modules/bluebird/js/release/async.js:93:12)
    at _drainQueue (/home/ubu/projects/stat/node_modules/bluebird/js/release/async.js:86:9)
    at Async._drainQueues (/home/ubu/projects/stat/node_modules/bluebird/js/release/async.js:102:5)
    at Immediate.Async.drainQueues (/home/ubu/projects/stat/node_modules/bluebird/js/release/async.js:15:14)
    at runCallback (timers.js:794:20)
    at tryOnImmediate (timers.js:752:5)
    at processImmediate [as _immediateCallback] (timers.js:729:5)

最佳答案

您在创建数据库表的 createdAt 和 updatedAt 列时遇到问题:

`'use strict';
module.exports = {
    up: (queryInterface, Sequelize) => {
        return queryInterface.createTable('Users', {
            id: {
                allowNull: false,
                autoIncrement: true,
                primaryKey: true,
                type: Sequelize.INTEGER
            },
            first_name: {
                type: Sequelize.STRING,
                allowNull: false
            },
            last_name: {
                type: Sequelize.STRING,
                allowNull: false
            },
            email: {
                type: Sequelize.STRING,
                allowNull: false,
                unique: true
            },
            username: {
                type: Sequelize.STRING,
                allowNull: false,
                unique: true
            },
            password: {
                type: Sequelize.STRING,
                allowNull: false
            },
            dob: {
                type: Sequelize.DATE,
                allowNull: false
            },
            createdAt: {
                allowNull: false,
                type: Sequelize.DATE,
                defaultValue: Sequelize.literal('NOW()')
            },
            updatedAt: {
                allowNull: false,
                type: Sequelize.DATE,
                defaultValue: Sequelize.literal('NOW()')
            }
        }, {
            timestamps: true,
            underscored: true
        });
    },
    down: (queryInterface, Sequelize) => {
        return queryInterface.dropTable('Users');
    }
};`

关于node.js - 尝试访问小写 "users"而不是大写 "Users"的表名的 Sequelize 模型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58561160/

相关文章:

javascript - NodeJS 的 Promise 爬虫的递归循环

mysql - Sequelize 中的 findAll() 找不到在事务中创建的行

postgresql - 从 PostgreSQL 检索原始通知文本

javascript - 使用 Sequelize 获取 "TypeError: Cannot read property ' findAll' of undefined"

javascript - Express Handlebars-页面正在路由至 404

java - 如何使用制表符格式化输出以使表格看起来清晰

你能在 C 中编辑 Postgres ArrayType 吗?

javascript - 将 Sequelize promise 嵌入到 javascript async/await 链中

mysql - sequelize 多个外键只包含一列

node.js - Node.js 中的 UDP 发送性能