【问题标题】:findAll() is not a function in sequelizefindAll() 不是 sequelize 中的函数
【发布时间】:2021-03-21 17:09:27
【问题描述】:

我正在使用带有 sequelize 的 Express.js 我正在尝试从表中获取数据,但 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;
};

产品属性模型


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 && 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 模型中获取数据,
每次我得到同样的错误:TypeError: Checkout_product.findAll is not a function

【问题讨论】:

    标签: javascript node.js sequelize.js


    【解决方案1】:

    const Checkout_product = require('../models').table_name; 可以试试吗

    【讨论】:

      【解决方案2】:

      您正在使用 Sequelize 已弃用的传统方式来初始化模型。可以使用并建议使用 requireextends 的更新方法。更多信息请查看docs

      关于你的代码....

      您既没有正确初始化 db 结构,也没有在以后正确使用它...

      首先你的代码在这里index.js:

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

      只需在 db 对象中加载模型文件。但是这些文件是要以 sequelize 对象作为参数调用的函数。这是通过将它们提供给sequelize.import 来完成的,sequelize.import 管理定义的模型函数的正确调用以创建模型实例。检查https://sequelize.org/master/manual/models-definition.html

      同样在成功初始化数据库后,在您的控制器代码中,require('../models') 返回总的db 对象。因此,如果您想在您的情况下使用特定模型作为 Checkout_product,您必须在对象中访问它:

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

      【讨论】:

      • 我使用 sequlize.import 方法更新了 index.js 文件 fs.readdirSync(__dirname) .filter(function(file) { return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); }) .forEach(function(file) { var model = sequelize["import"](path.join(__dirname, file)); db[model.name] = model; }); 现在,我收到此错误:return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); ReferenceError: basename 未定义
      • 我无法理解你的代码 sn-p,basename 没有在任何地方初始化,所以说 undefined 是正确的
      猜你喜欢
      • 2020-04-08
      • 2017-04-24
      • 2019-11-17
      • 2018-07-09
      • 1970-01-01
      • 2023-03-06
      • 2020-05-13
      • 2020-10-07
      • 2023-02-16
      相关资源
      最近更新 更多