#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;
похоже, что я правильно импортировал его в свой маршрут регистрации, но не в мой файл конфигурации паспорта!