2017-12-12 2 views
0

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) 
+0

können Sie den Inhalt von User.js posten? – asosnovsky

+0

Ich habe User.js und Product.js hinzugefügt – kaaleppi3

+0

'Through' sollte ein Sequelize-Modell, keine Zeichenfolge sein. Das ist, was der Fehler sagt – yBrodsky

Antwort

0

Ich bin nicht in der Lage einen Kommentar hinzufügen wegen einen guten Ruf von weniger als 50. Meine Vermutung wäre, dass die User-Modell zu dem Zeitpunkt nicht bereit ist, Sie versuchen, es zu benutzen. Können Sie Ihre app.js oder eine gleichwertige Datei posten? Ich vermute, dass zwischen einem 'require' irgendwo und Ihren Dateinamen ein Missverhältnis besteht.

habe ich die Beispiele, die Sie oben und die folgende Zeile in app.js zur Verfügung gestellt haben database.js zu verlangen:

var db = require('./database'); 

Dies funktioniert gut für mich.

Allerdings, wenn ich es (Versalien- ‚D‘) zu ändern:

var db = require('./Database'); 

Ich kann den Fehler, den Sie erleben reproduzieren.

Sie müssten db.sync() aufrufen, um Ihre definierten Modelle mit der DB zu synchronisieren.

 db.sync({force: false}) 
     .then(message => { 
      console.log('db synced'); 
     }) 
     .catch(function(err) { 
      throw err; 
     }); 

Hoffe das hilft.

+0

Ich habe hinzugefügt app.js. Reicht es nicht aus, Datenbank in Modelldateien zu benötigen? – kaaleppi3

+0

Sie müssen db.sync() aufrufen, um Ihre definierten Modelle mit der DB zu synchronisieren. – Faz

Verwandte Themen