node.js - NodeJs + Sequelize + Express 查询时添加的额外关联键

标签 node.js sequelize.js

我有 2 个表:国家和地点。一个国家可以有多个景点,一个景点属于一个国家。

我已经为 2 个表生成了 sequelize 所需的迁移:

国家.js

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Countries', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        allowNull: false,
        unique: true,
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        defaultValue: Sequelize.literal('NOW()'),
        type: Sequelize.DATE,
      },
      updatedAt: {
        allowNull: false,
        defaultValue: Sequelize.literal('NOW()'),
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Countries');
  }
};

Spots.js
'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('Spots', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        allowNull: false,
        type: Sequelize.STRING
      },
      wind: {
        type: Sequelize.FLOAT
      },
      country_id: {
        type: Sequelize.INTEGER,
        references: {
          model: 'Countries', // name of Target table
          key: 'id', // key in Target table that we're referencing
        },
        onDelete: 'CASCADE',
      },
      createdAt: {
        allowNull: false,
        defaultValue: Sequelize.literal('NOW()'),
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        defaultValue: Sequelize.literal('NOW()'),
        type: Sequelize.DATE
      }
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('Spots');
  }
};

一切正常。我定义了一些路由和一些 Controller ,并尝试在我的 Controller 中执行 Spots.findAll()
const models = require('../models/index')
const Spot = models.Spot

exports.index = async (req, res, next) => {
  const spots = await Spot.findAll()

  res.status(200).json(spots)
}

然而,查询 Spot.findAll() 试图询问 CountryId,这是一个显然不存在的键,我不希望它存在。
Executing (default): SELECT `id`, `name`, `wind`, `country_id`, `createdAt`, `updatedAt`, `CountryId` FROM `Spots` AS `Spot`;
(node:13027) UnhandledPromiseRejectionWarning: SequelizeDatabaseError: Unknown column 'CountryId' in 'field list'

这些是现货和国家型号:

国家.js
'use strict';
module.exports = (sequelize, DataTypes) => {
  const Country = sequelize.define('Country', {
    name: DataTypes.STRING
  }, {});
  Country.associate = function(models) {
    // associations can be defined here
    Country.hasMany(models.Spot)
  };
  return Country;
};

现货.js
'use strict';
module.exports = (sequelize, DataTypes) => {
  const Spot = sequelize.define('Spot', {
    name: DataTypes.STRING,
    wind: DataTypes.FLOAT,
    country_id: DataTypes.INTEGER
  }, {});
  Spot.associate = function(models) {
    // associations can be defined here
    Spot.belongsTo(models.Country, {
      foreignKey: 'country_id'
    });
    Spot.hasMany(models.Favorite)
  };
  return Spot;
};

我将foreign_key 属性添加到belongs_to 因为我认为错误肯定来自关联(我仍然认为它确实如此)。

为什么会发生以及如何解决?

最佳答案

问题是因为您在这里混合了所有内容,请遵循一种约定,camelCase 或snack_case。

country_id 写为 countryId 并将您的表名更改为小写,您就可以开始了。

关于node.js - NodeJs + Sequelize + Express 查询时添加的额外关联键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58247303/

相关文章:

javascript - 如何在 Windows 上使用单个 NPM 命令运行多个 NPM 命令

mysql - Sequelize 不良握手错误

mysql - Sequelize findOrCreate 不排除排除数组中定义的属性

javascript - 制作 f 炸弹计数器不和谐机器人,Sequelize

node.js - 在 Sequelize 中使用带有内部连接的组给出错误

node.js - ServerResponse 和 http.IncomingMessage 之间有什么区别?

sql - TypeORM - 如何删除最后添加的行?

node.js - 尝试发布到未定义的 mysql “Cannot read property ' create' 时出错”

node.js 需要()缓存 - 可能无效?

javascript - 使用正确的后备路由结构从 Nodejs 中的异步调用传递数据的最佳实践