Ich versuche, System zu erstellen, wo Benutzer an Produkten interessiert sein können. Es gibt viele Produkte und mehrere Benutzer können sich für dasselbe Produkt interessieren. Ich habe ein Tutorial (https://github.com/ianmunrobot/1702-express-review) gefolgt und es zu meinen Zwecken geändert, um seed.js-Skript zu erstellen, das folgende Tabellen zu db erstellt: Interessen, Benutzer, Produkte, die database.js als config verwenden. Wenn ich versuche, die self database.js-Datei mit dem Rest meines Projekts zu verwenden, bekomme ich einen Fehler.Nodejs Sequelize Beziehungen funktioniert nicht
user.js
// The User model.
const Sequelize = require('sequelize');
const bcrypt = require('bcrypt');
const config = require('../config');
const db = require('../database');
const Product = require('./Product');
// 1: The model schema.
const modelDefinition = {
username: {
type: Sequelize.STRING,
unique: true,
allowNull: false
},
email: {
type: Sequelize.STRING,
unique: true,
allowNull: false
},
password: {
type: Sequelize.STRING,
allowNull: false,
},
role: {
type: Sequelize.STRING,
allowNull: true,
},
};
// 2: The model options.
const modelOptions = {
instanceMethods: {
comparePasswords: comparePasswords,
},
hooks: {
beforeValidate: hashPassword
},
};
// 3: Define the User model.
const UserModel = db.define('User', modelDefinition, modelOptions);
// Compares two passwords.
function comparePasswords(password, callback) {
bcrypt.compare(password, this.password, function (error, isMatch) {
if (error) {
return callback(error);
}
return callback(null, isMatch);
});
}
// Hashes the password for a user object.
function hashPassword(user) {
if (user.changed('password')) {
return bcrypt.hash(user.password, 10).then(function (password) {
user.password = password;
});
}
}
module.exports = UserModel;
Products.js
const Sequelize = require('sequelize');
const db = require('../database');
const User = require('./User');
const ProductModel = db.define('Product', {
name: {
type: Sequelize.STRING,
allowNull: false,
},
price: {
type: Sequelize.INTEGER,
},
});
module.exports = ProductModel;
database.js:
const Sequelize = require('sequelize');
const config = require('./config');
const db = new Sequelize(
config.db.name,
config.db.user,
config.db.password,
config.db.details,
);
module.exports = db;
const User = require('./models/User.js');
const Product = require('./models/Product.js');
Product.belongsToMany(User, { as: 'users', through: 'Interests' });
app.js:
const express = require('express');
const path = require('path');
const logger = require('morgan');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const promisify = require('es6-promisify');
const morgan = require('morgan');
const sequelize = require('sequelize');
const passport = require('passport');
const jwt = require('jsonwebtoken');
const hookJWTStrategy = require('./passportStrategy');
const routes = require('./routes/index');
const app = express();
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Credentials', 'true');
res.header('Access-Control-Allow-Headers', 'Origin, Content-Type, Authorization, x-id, Content-Length, X-Requested-with');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
next();
});
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(logger('dev'));
app.use(passport.initialize());
// Hook the passport JWT strategy.
hookJWTStrategy(passport);
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
// catch 404 and forward to error handler
app.use((req, res, next) => {
const err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handler
app.use((err, req, res, next) => {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
Erwartete Ergebnisse sind, dass der Benutzer an Produkten interessiert sein könnte. Die Interessen sollten in Interesse Tabelle sein und Benutzer sollte in der Lage sein, an vielen Produkten interessiert zu sein.
Fehler:
Error: Product.belongsToMany called with something that's not an instance of Sequelize.Model
at Model.Mixin.belongsToMany (/home/mikko/git/s/node_modules/sequelize/lib/associations/mixin.js:252:11)
at Object.<anonymous> (/home/mikko/git/s/database.js:17:9)
können Sie den Inhalt von User.js posten? – asosnovsky
Ich habe User.js und Product.js hinzugefügt – kaaleppi3
'Through' sollte ein Sequelize-Modell, keine Zeichenfolge sein. Das ist, was der Fehler sagt – yBrodsky