2017-01-31 2 views
4

Ich habe einen NodeJS-Server mit Express. Für meine Datenbank verwende ich Sequelize, und ich definiert meine Modelle wie auf der Sequelize Dokumentation:NodeJS Sequelize - Kann Eigenschaft '_isSequelizeMethod' von undefined nicht lesen

models/index.js

"use strict"; 

var fs  = require("fs"); 
var path  = require("path"); 
var Sequelize = require("sequelize"); 

var sequelize = new Sequelize('mydb', 'root', '', { 
    host: 'localhost', 
    dialect: 'mysql', 

    pool: { 
    max: 5, 
    min: 0, 
    idle: 10000 
    } 
}); 
var db  = {}; 

fs 
    .readdirSync(__dirname) 
    .filter(function(file) { 
    return (file.indexOf(".") !== 0) && (file !== "index.js"); 
    }) 
    .forEach(function(file) { 
    var model = sequelize.import(path.join(__dirname, file)); 
    db[model.name] = model; 
    }); 

Object.keys(db).forEach(function(modelName) { 
    if ("associate" in db[modelName]) { 
    db[modelName].associate(db); 
    } 
}); 

db.sequelize = sequelize; 
db.Sequelize = Sequelize; 

module.exports = db; 

models/server.js

"use strict"; 

module.exports = function(sequelize, DataTypes) { 
    var Server = sequelize.define('Server', { 
    id: { 
     type: DataTypes.INTEGER, 
     primaryKey: true, 
     autoIncrement: true, 
     unique: true, 
     allowNull: false 
    }, 
    reference: DataTypes.STRING, 
    name: DataTypes.STRING 
    }, 
    { 
    timestamps: false, 
    paranoid: false, 
    underscored: true, 
    freezeTableName: true, 
    tableName: 'server' 
    }); 

    return Server; 
}; 

models/Teilnehmer js

"use strict"; 

module.exports = function(sequelize, DataTypes) { 
    var Subscriber = sequelize.define('Subscriber', { 
    id: { 
     type: DataTypes.INTEGER, 
     primaryKey: true, 
     autoIncrement: true, 
     unique: true, 
     allowNull: false 
    }, 
    type: { 
     type: DataTypes.ENUM, 
     values: ['email', 'phone'] 
    }, 
    contact: DataTypes.STRING, 
    server_id: DataTypes.INTEGER, 
    notified: DataTypes.INTEGER, 
    last_notified: DataTypes.DATE 
    }, 
    { 
    timestamps: false, 
    paranoid: false, 
    underscored: true, 
    freezeTableName: true, 
    tableName: 'subscriber', 
    classMethods: { 
     associate: function(models) { 
     Subscriber.belongsTo(models.Server, { foreignKey: 'server_id', targetKey: 'id' }); 
     } 
    } 
    }); 

    return Subscriber; 
}; 

Und hier meine Route:

var models = require('../models'); 

app.get('/subscribe/:type/:contact/:ref', function(req, res) { 
     var type = req.params.type; 
     var contact = req.params.contact; 
     var ref = req.params.ref; 

     models.Subscriber.findAll().then(function(result) { 
      console.log(result); 
     }); 

     res.render('full/subscribed.twig', { 
      type: type, 
      contact: contact, 
      server : server 
     }); 
    }); 

Und wenn ich meine Route Zugriff Ich habe diese Fehlermeldung:

Unhandled rejection TypeError: Cannot read property '_isSequelizeMethod' of undefined 
at /Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1077:20 
at Array.map (native) 
at Object.QueryGenerator.selectQuery (/Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/dialects/abstract/query-generator.js:1067:55) 
at QueryInterface.select (/Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/query-interface.js:669:25) 
at null.<anonymous> (/Users/me/Projects/nodejs/myproject/node_modules/sequelize/lib/model.js:1398:32) 
at tryCatcher (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/util.js:16:23) 
at Promise._settlePromiseFromHandler (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:510:31) 
at Promise._settlePromise (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:567:18) 
at Promise._settlePromise0 (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:612:10) 
at Promise._settlePromises (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/promise.js:691:18) 
at Async._drainQueue (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/async.js:133:16) 
at Async._drainQueues (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/async.js:143:10) 
at Immediate.Async.drainQueues [as _onImmediate] (/Users/me/Projects/nodejs/myproject/node_modules/bluebird/js/release/async.js:17:14) 
at processImmediate [as _immediateCallback] (timers.js:383:17) 

Ich habe versucht, einige Erfahrungen auf einer unabhängigen NodeJS Datei und alles gut funktionieren zu tun, ich starten nur meine eigenständige JS-Datei mit einigen Aktionen auf der Datenbank und alles ist in Ordnung. Wenn ich genau die gleichen Dinge auf meiner Express Route mache, habe ich diesen Fehler ...

Jemand hat eine Idee warum?

Vielen Dank im Voraus, Steve

Antwort

3

Ho mein Gott !!! Ich fand !

Es ist, weil ich eine Funktion hinzufügen, haben Prototyp-Objekt ...

Wenn sequelize das Ziel von Optionen des Modells erhalten, wenn Sie einige benutzerdefinierte Funktionen auf Ihrem Objekt Prototyp es ...

scheitern haben

auf node_modules/sequelize/lib/Dialekte/abstract/Abfrage-generator.js (Linie 1067)

mainAttributes = mainAttributes && mainAttributes.map(function(attr) { 

Die mainAttributes enthält meine benutzerdefinierte Funktionen wie folgt aus:

[ 'id', 
    'reference', 
    'name', 
    [ undefined, 'join' ], 
    [ undefined, 'getKeyByValue' ] ] 

Meine Funktionen, die ich zu Object hinzugefügt habe, sind join und getKeyByValue.

So zu schließen, fügen Sie nicht benutzerdefinierte Funktionen, wenn Sie Sequelize verwenden, um Object.prototype;)

Hoffe, dass es anderen Menschen helfen wil.

Steve

+0

Entschuldigungen konnte aber nicht verstehen, was Sie versuchen zu kommunizieren .. könnten Sie pls erarbeiten, wo ich Änderungen vornehmen müssen, um diesen Fehler zu entfernen. Ich stehe mit einem ähnlichen Problem mit genau gleichen Stack-Trace –

+0

Hallo Amritpal, in meinem Code hatte ich etwas wie "Object.prototype.join = function() {};" Diese Zeile erzeugte meinen Fehler. Versuchen Sie, console.log node_modules/sequelize/lib/dialects/abstract/query-generator.js (Zeile 1067) die Variable "mainAttributes", werden Sie sehen. – ReaperSoon

0

Wenn Sie eine Tabelle importieren, ist es bereits zu dem sequelize.models Array hinzugefügt, so dass Sie explicity brauchen nicht wieder aufgenommen. Die sequelize docs müssen folgende aktualisiert werden:

readdirSync(__dirname) 
.filter(file => (file.indexOf('.') !== 0) && (file !== 'index.js')) 
.forEach(file => { 
    sequelize.import(path.join(__dirname, file)) 
}) 

Object 
.keys(sequelize.models) 
.forEach(modelName => { 
    if ('associate' in sequelize.models[modelName]) { 
     sequelize.models[modelName].associate(sequelize.models) 
    } 
}) 
Verwandte Themen