我使用 Sequelize 构建 API,但我的控制器不使用 findAndCountAll 来显示外键信息

问题描述 投票:0回答:1

我是使用 NodeJS 和 Sequelize 创建 API 的初学者。 在来这里之前,我在几个论坛/文档上搜索了我的问题,但我总是得到相同的结果。

正如你在我的结果中看到的,我总是得到“fuelId:1”。 相反,我希望它显示这个外键 1 的信息。也就是说这个燃料的名称及其信息。

PS:我删除了部分无用代码,否则堆栈溢出告诉我我发布了太多代码

MyControllers.js:

const sequelize = require('../db/sequelize')
    const getAll = (req, res) => {
        const modelName = req.params.modelName;
        const Model = sequelize[modelName];
        if (!Model) {
            const message = `Le modèle "${modelName}" n'existe pas.`;
            return res.status(404).json({ message });
        }
            Model.findAndCountAll({
                include: [
                    {
                        model: sequelize['fuels'],
                        foreignKey: 'fuelId',
                        as: 'fuels',
                        attributes: ['id','name']
                    }
                ]
            })
                .then(items => {
                    const status = 200
                    const isSuccess = true
                    const message = 'La liste a bien été récupérée.'
                    const total = items.count
                    res.json({ isSuccess, status, message, total, results: items })
                })
    } 

Sequelize.js:

const { Sequelize, DataTypes } = require('sequelize');
const FuelModel = require('../models/fuel');
const CarModel = require('../models/car');
const fuelMock = require('./mocks/mock-fuel');
const carMock = require('./mocks/mock-cars');
const fuels = FuelModel(sequelize, DataTypes);
const cars = CarModel(sequelize, DataTypes);

fuels.hasMany(cars, {foreignKey: 'fuelId', as: 'cars'});
cars.belongsTo(fuels, {foreignKey: 'fuelId', as: "fuels"});

const initDb = async () => {
    const _ = await sequelize.sync({ force: true })
    fuelMock.map(fuel => {
        fuels.create({
            name: fuel.name
        })
    })
    carMock.map(car => {
        cars.create({
            name: car.name,
            picture: car.picture,
            power: car.power,
            horses: car.horses,
            kms: car.kms,
            first_registration: car.first_registration,
            seating_places: car.seating_places,
            doors: car.doors,
            co2: car.co2,
            price: car.price,
            fuelId: car.fuelId,
        })
        .then(car => console.log(JSON.stringify(car)))
    })
}

module.exports = { 
    initDb, fuels,cars
}

我的结果:

        "rows": [
          {
            "id": 1,
            "name": "AUDI | A1 | SPORTBACK 30 TFSI S-LINE 1",
            "picture": "annonces/1200x900/53188-dlTXSoYqsnthVjFPwkfg.jpg",
            "power": 81,
            "horses": 110,
            "kms": 11400,
            "first_registration": "03-2023",
            "seating_places": 5,
            "doors": 5,
            "co2": 125,
            "price": 24980,
            "created": "2024-02-26T12:25:16.000Z",
            "fuelId": 1
          },
}

我的车型:

    module.exports = (sequelize, DataTypes) => {
        const Car = sequelize.define('Car', {
            id: {
                type: DataTypes.INTEGER,
                primaryKey: true,
                autoIncrement: true
            },
            name: {
                type: DataTypes.STRING,
                allowNull: false,
                unique: {
                    msg: 'Le nom est déjà pris.'
                },
                validate: {
                    notEmpty: { msg: 'Le nom ne peut pas être vide' },
                    notNull: { msg: 'Le nom est une propriété requise' }
                }
            },
            picture: {
                type: DataTypes.STRING,
                allowNull: false,
                validate: {
                    isUrl: { msg: 'Utilisez uniquement une URL valide pour l\'image.' },
                    notNull: { msg: 'L\'image est une propriété requise' }
                }
            },
            power: {
                type: DataTypes.INTEGER,
                allowNull: false,
            },
            horses: {
                type: DataTypes.INTEGER,
                allowNull: false,
            },
            kms: {
                type: DataTypes.INTEGER,
                allowNull: false,
            },
            first_registration: {
                type: DataTypes.STRING,
                allowNull: false,
            },
            seating_places: {
                type: DataTypes.INTEGER,
                allowNull: false,
            },
            doors: {
                type: DataTypes.INTEGER,
                allowNull: false,
            },
            co2: {
                type: DataTypes.INTEGER,
                allowNull: false,
            },
            price: {
                type: DataTypes.INTEGER,
                allowNull: false,
            }, {
        timestamps: true,
        createdAt: 'created',
        updatedAt: false,
        tableName: 'cars'
    })

    return Car
}

我的燃料模型

module.exports = (sequelize, DataTypes) => {
    const Fuel =  sequelize.define('Fuel', {
      id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
      },
      name: {
        type: DataTypes.STRING,
        allowNull: false,
      },
    }, {
      timestamps: true,
      createdAt: 'created',
      updatedAt: false,
        tableName: 'fuels'
    })

    return Fuel
  }
javascript node.js sequelize.js
1个回答
0
投票

这是关于如何发出另一个查询来获取燃料详细信息的评论的后续

const initDb = async () => {
    const _ = await sequelize.sync({ force: true })
    fuelMock.map(fuel => {
        fuels.create({
            name: fuel.name
        })
    })
    carMock.map(car => {
        cars.create({
            name: car.name,
            picture: car.picture,
            power: car.power,
            horses: car.horses,
            kms: car.kms,
            first_registration: car.first_registration,
            seating_places: car.seating_places,
            doors: car.doors,
            co2: car.co2,
            price: car.price,
            fuelId: car.fuelId,
        })
            .then((car) => {
                const fuelDetail = fuels.findOne({
                    where: {
                        id: car.fuelId
                    }
                })
                
                car.fuel_name = fuelDetail.name
                console.log(JSON.stringify(car))
            })
}
© www.soinside.com 2019 - 2024. All rights reserved.