#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