Не удается экспортировать несколько моделей продолжения из одного файла

#javascript #node.js #sequelize.js #passport.js

#javascript #node.js #sequelize.js #passport.js

Вопрос:

У меня есть 3 модели продолжения, которые я определил, импортированные в файл с именем sequelize.js вот так:

 const { Sequelize } = require("sequelize");
const UserModel = require("./models/user");
const ItemModel = require("./models/item");
const ReservationModel = require("./models/reservation");
const config = require("./dbconfig");
const db = config.database;

const Item = ItemModel(sequelize, Sequelize);
const User = UserModel(sequelize, Sequelize);
const Reservation = ReservationModel(sequelize, Sequelize);

Reservation.hasMany(Item);
Item.belongsTo(Reservation);
Reservation.belongsTo(User);
  

Затем я пытаюсь их экспортировать:

 module.exports = { Item, User, Reservation };
  

Однако, когда я пытаюсь получить доступ к одному из них и использовать функцию модели, я получаю сообщение об ошибке.

 const Model = require("../../sequelize");
const passport = require("passport");

module.exports = (app) => {
  app.post("/registerUser", (req, res, next) => {
    passport.authenticate("register", (err, user, info) => {
      if (err) {
        console.log(err);
      }
      if (info !== undefined) {
        console.log(info.message);
        res.send(info.message);
      } else {
        req.logIn(user, (err) => {
          const data = {
            first_name: req.body.first_name,
            last_name: req.body.last_name,
            email: req.body.email,
            username: user.email,
          };
          Model.User.findOne({
            where: {
              email: data.username,
            },
          }).then((user) => {
            user
              .update({
                first_name: data.first_name,
                last_name: data.last_name,
                email: data.email,
              })
              .then(() => {
                console.log("user created in db");
                res.status(200).send({ message: "user created" });
              });
          });
        });
      }
    })(req, res, next);
  });
};

  

результаты в

 TypeError: User.findOne is not a function
  

Это не проблема, когда я просто экспортирую одну из них.

 module.exports = User;
  
 const User = require("./sequelize");
...
User.findOne(...) //works
  

Я пробовал несколько способов экспорта, но, похоже, ни один из них не работает.
например

 module.exports = {
    Item: Item,
    User: User,
    Reservation: Reservation,
}
  

и

 exports.Item = Item;
exports.User = User;
exports.Reservation = Reservation;
  

редактировать: Вот моя пользовательская модель для справки

 module.exports = (sequelize, type) => {
  return sequelize.define(
    "user",
    {
      id: {
        type: type.INTEGER,
        primaryKey: true,
        autoIncrement: true,
      },
      first_name: type.STRING,
      last_name: type.STRING,
      credentials: type.STRING,
      email: {
        type: type.STRING,
        allowNull: false,
      },
      password: {
        type: type.STRING,
        allowNull: false,
      },
    },
    {
      tableName: "Users",
    }
  );
};
  

Почему я не могу экспортировать эти несколько объектов?

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

1. Кстати: User.findOne() находится внутри вызова passport.authenticate(). Я не уверен, будет ли это иметь какое-либо отношение к ошибке.

Ответ №1:

У меня есть точная структура, которую вы используете, импортируя все модели sequelize в один файл, а затем module.экспортируя их в объект, и единственное, что я вижу, что отличается, это то, как вы определяете свои модели. Возможно, я устарел, но я узнал как таковой:

 const Sequelize = require('sequelize');
const db = require('../db');

module.exports = db.define('users', {
    id: {
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER, 
        unique: true
    },
}, {
    timestamps: true,
});
  

Объявление базы данных

 const Sequelize = require('sequelize');

const db = new Sequelize(
  process.env.DATABASE_URL, {
    logging: false
  }
);
module.exports = db;
  

Затем ваш центральный импорт

 const User = require('./user');
const Order = require('./order');

Order.belongsTo(User)
User.hasMany(Order)

module.exports = {
    User,
    Order
};
  

Затем, используя его

 const models = require('./models');
const results = await models.User.destroy({
    where: {
        id: id
    }
});
if(results){
    return results;
}
  

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

1. Спасибо за ответ. Я не совсем уверен, имеет ли к этому какое-либо отношение то, как я определяю свои модели. Все работает нормально, когда я экспортирую только пользователя, однако, когда я экспортирую все 3 модели, ничего не работает.

2. Я отредактировал свой пост, чтобы добавить еще немного контекста вокруг моего кода. Надеюсь, это еще немного прояснит ситуацию

Ответ №2:

Найдено, что было не так. В моем passport.js файл, в котором я определил свою LocalStrategy, я выполнял неправильный импорт.

Мой экспорт в sequelize.js был

 modules.export = {Item, User, Reservation};
  

пока мой импорт в passport.js было просто

 const User = require("../sequelize");
  

когда это должно было быть

 const Model = require("../sequelize");
const User = Model.User;
  

похоже, что я правильно импортировал его в свой маршрут регистрации, но не в мой файл конфигурации паспорта!