使用 Next.js 和 Sequelize 从控制器检索模型数据

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

我正在开发一个项目,其中我的 Vue.js 是我的前端,我的 Next.js 是我的后端。一切似乎都很顺利,但我不知道如何将我的模型数据返回到我的控制器......

更多信息:

  • 我使用 Sequelize 创建模型、迁移和播种器。
  • 我的数据库位于 PostgreSQL 上

这是我的控制器(recetteController.js),我在其中调用 findAllRecette() :

// import { Recette } from '../../models/recette';
const { Recette } = require('../../models/recette');
// const Recette = require('../../models/recette');

console.log(Recette);

export default async function handler(req, res) {
    try {
        const recettes = await Recette.getAllRecette(); 
        res.status(200).json(recettes);
    } catch (error) {
        res.status(500).json({ error: 'Erreur lors de la récupération des recettes' });
    }
}

这是我的模型(recette),我的函数 getAllRecette() 在哪里:

'use strict';
const { Model } = require('sequelize');

module.exports = (sequelize, DataTypes) => {
  class Recette extends Model {
    static associate(models) {
      Recette.belongsTo(models.Difficulte, { foreignKey: 'id_difficulte', as: 'difficulte' });
      Recette.belongsTo(models.Categorie, { foreignKey: 'id_categorie', as: 'categorie' });
    }
  
    // Récupère toutes les recettes
    static async getAllRecette() {
      console.log("CONGRATS");
      const recettes = await this.findAll();
      return recettes;
    }
  }

  Recette.init({
    nom: DataTypes.STRING,
    description: DataTypes.STRING,
    portion: DataTypes.INTEGER,
    temps: DataTypes.INTEGER,
    id_difficulte: DataTypes.INTEGER,
    id_categorie: DataTypes.INTEGER,
    image: DataTypes.TEXT
  }, {
    sequelize,
    modelName: 'Recette',
  });

  return Recette;
};

除了 Laravel 之外,我以前从未这样做过,也许我做错了......(MVC)

问题是 console.log(Recette) 给了我一个 '未定义''[函数(匿名)]',具体取决于我如何导入 Recette

我还尝试直接在我的控制器中调用 findAll() 但这并没有改变我的控制器找不到我的模型的事实。

请我花了太多时间来解决这个问题!谢谢!

javascript next.js sequelize.js
1个回答
0
投票

方法如下:使用 import {} 而不是 require() 并在 js 文件中添加到数据库的连接,如下所示:

//database.js
import { Sequelize } from 'sequelize';

const sequelize = new Sequelize('db_name', 'user', 'password', {
  host: 'host_name',
  dialect: 'dialect', //ex:postgres
  logging: console.log, //activate sequelize log 
});

(async () => {
  try {
    await sequelize.authenticate();
    console.log('Database connection successfully established.');
  } catch (error) {
    console.error('Error connecting to the database :', error);
  }
})();

export default sequelize;

然后在模型文件中使用此文件,如下所示:(从“数据库”导入续集;

//model.js
import { DataTypes, Model } from 'sequelize';
import sequelize from 'database';

class MyClass extends Model {
  static associate(models) {
   
  }

}

export default (sequelize) => {
  Recette.init({
    name: DataTypes.STRING,
    description: DataTypes.STRING,
    //... 
  }, {
    sequelize,
    modelName: 'MyClass',
  });

  return MyClass;
};

export { MyClass }; 

那么控制器应该看起来像这样:

import {MyClass} from '../models/myClass';

export default async function handler(req, res) {
  try {
    const datas = await MyClass.findAll(); 
    res.status(200).json(datas);
  } catch (error) {
    res.status(500).json({ error: 'Error while fetching datas' });
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.