findAll() не является функцией в sequelize

#javascript #node.js #sequelize.js

#javascript #node.js #sequelize.js

Вопрос:

Я использую Express.js с помощью sequelize я пытаюсь получить данные из таблицы, но метод findALL() не работает

Здесь я делюсь своими моделями и файлом контроллера

модель checkout_product

 module.exports = function (sequelize, DataTypes) {
    var Checkout_product = sequelize.define(
        "Checkout_products",
        {
            name: {
                type: DataTypes.STRING
            },
            ptice: {
                type: DataTypes.STRING
            },
            image: {
                type: DataTypes.STRING
            },
            quantity: {
                type: DataTypes.INTEGER
            },
        },
    );

   Checkout_product.associate = function (models) {
        Checkout_product.hasMany(models.Product_attribute, {
            foreignKey: "product_id",
            sourceKey: "id"
        });
    };

    return Checkout_product;
};
 

модель product_attribute

 
module.exports = function (sequelize, DataTypes) {
    var Product_attribute = sequelize.define(
        "product_attributes",
       {
            product_id: {
                type: DataTypes.INTEGER
            },
            attribute_name: {
                type: DataTypes.STRING
            },
            attribute: {
                type: DataTypes.STRING
            },
            price: {
                type: DataTypes.STRING
            },
        },
    );

     Product_attribute.associate = (models) => {
        Product_attribute.belongsTo(models.Checkout_product, {
            foreignKey: "product_id",
            sourceKey: "id"
        });
    };

    return Product_attribute;
};



 

models/index.js файл

 "use strict";

const fs = require("fs");
const path = require("path");
const Sequelize = require("sequelize");
const config = require("./../config/development").database;

let sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config
);
let db = {};

fs
  .readdirSync(__dirname)
  .filter(function(file) {
    return file.indexOf(".") !== 0 amp;amp; file !== "index.js";
  })
  .forEach(function(file) {
    let model = require(path.join(__dirname, file));
    db[model.name] = model;
  });
Object.keys(db).forEach(function(modelName) {
  if ("associate" in db[modelName]) {
    db[modelName].associate(db);
  }
});

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

module.exports = db;
 

Контроллер

 const Checkout_product  = require('../models');

module.exports.checkout_product_get = function (req, res) {
  Checkout_product.findAll({
     include: [ {
       model : Product_attributes,
     }]
  })
  .then(checkout_product => {
        res.json(checkout_product)
  })
}
 

Я застрял, чтобы получить данные из checkout_product и его дочерней модели product_attribute model,
Каждый раз я получаю одну и ту же ошибку: TypeError: Checkout_product.findAll не является функцией

Ответ №1:

const Checkout_product = require(‘../models’).имя_таблицы; Можете ли вы попробовать это

Ответ №2:

Вы используете устаревший способ Sequelize для инициализации моделей. require Доступны и предложены более новые способы с extends и. Проверьте документы для получения дополнительной информации.

Что касается вашего кода….

Вы не инициализируете структуру БД должным образом и не используете ее правильно позже…

Сначала ваш код здесь в index.js :

  .forEach(function(file) {
    let model = require(path.join(__dirname, file));
    db[model.name] = model;
  });
 

Просто загружает файлы модели в db объект. Но эти файлы являются функциями, которые должны вызываться с объектом sequelize в качестве параметра. Это делается путем предоставления их sequelize.import тому, который управляет правильным вызовом определенных функций модели для создания экземпляров модели. Проверьте https://sequelize.org/master/manual/models-definition.html

Также после успешной инициализации базы данных в вашем коде контроллера require('../models') возвращает полный db объект. Поэтому, если вы хотите использовать определенную модель в качестве Checkout_product в вашем случае, вам необходимо получить к ней доступ в объекте:

 const db = require('../models');
db.Checkout_product.findAll()...
 

Комментарии:

1. Я обновил index.js файл с использованием метода sequlize.import fs.readdirSync(__dirname) .filter(function(file) { return (file.indexOf('.') !== 0) amp;amp; (file !== basename) amp;amp; (file.slice(-3) === '.js'); }) .forEach(function(file) { var model = sequelize["import"](path.join(__dirname, file)); db[model.name] = model; }); Теперь я получаю эту ошибку: return (file.indexOf(‘.’) !== 0) amp;amp; ( файл !== базовое имя) amp;amp; (file.slice(-3) === ‘.js’); Ошибка ссылки: базовое имя не определено

2. Я не могу понять ваш фрагмент кода, базовое имя нигде не инициализируется, поэтому правильно сказать undefined