2016-01-14 3 views
2

TypeError: Cannot read property 'findAll' of undefined (expressjs).ТипError: Не удается прочитать свойство 'findAll' of undefined (expressjs)

Все функции (sequelize) не работают. Все ошибки: Не удается прочитать свойство 'метод sequelize' ...

module.exports = function (sequelize, DataTypes) { 
var User = sequelize.define('user', { 
    email: {type: DataTypes.STRING(32), unique: true, allowNull: false}, 
}); 

return User; 
}; 

Контроллер:

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

exports.index = function (request, response, next) { 
    models.User.findAll({attributes: ['id', 'username']}); 
}; 
+0

напишите содержимое своего ./../models/index.js или если вы создаете модели нестандартным способом, напишите об этом вместо этого. –

+0

@KrzysztofSztompka, http://pastebin.com/Ev5Mp2AD –

+0

спасибо, напишите, как вы запустите db –

ответ

0

Вы создали два экземпляра sequelize. Один в моделях/index.js в строке 12/14 и второй экземпляр в сценарии сервера в строке 19. И вы запускаете второй экземпляр, но в модели вы пытались использовать первый экземпляр.

Ваш файл model/index.js в порядке. В файле сервер добавьте

var database = require('path/to/models'); 

изменить пункт дБ:

database.sequelize .authenticate() .then(function(err) { console.log('Connection has been established successfully.'); }, function (err) { console.log('Unable to connect to the database:', err); });

И вы должны пройти «базы данных» объект контроллеров вместо models = require('./../models'); и от ваших контроллеров вы имеете доступ к вашей модели: database.User

+0

Hm, ReferenceError: база данных не определена при экспорте. index (c: \ webserver \ data \ htdocs \ newcloudy \ controllers \ user.js: 5: 5) http://pastebin.com/tS89jbBp –

+0

как передать объект базы данных из сценария сервера на контроллер? Похоже, что есть некоторая проблема с этим –

+0

var database = require ('./../ app.js'); и TypeError: Невозможно прочитать свойство «findAll» неопределенного. –

1

Ваш model/index.js выглядит хорошо. В контроллере попробовать findAll() метод внутри sequelize.sync().then(function() {

Вот мой подход к проблеме

nb: instead of models/index.js i have a similar db.js file inside config folder which having the dbconnection scripts and sequelize object.

Моего userController.js будет выглядеть (рабочий код):

var db = require('./../config/db'), 
seq = db.seq, 
Sequelize = db.Sequelize; 

module.exports = function(app) { 
    app.get('/getUsers',function(req,res){ 
     var Users = require('../models/UserModel')(app); //since i am binding to a single object - app 
     seq.sync().then(function() { 
      Users.findAll({ 
       attributes: ['usr_code', 'usr_name'] 
      }).then(function (users) { 
        users.forEach(function(user,index,arr){ 
         console.log(user.usr_code); 
        }); 
       }); 
     }); 
    }); 

} 

Надеется, что это помогает вы. :)

4

У меня была такая же проблема, и приведенные ниже изменения работали для меня. Это может быть полезно для будущих пользователей -

при использовании модели sequelize вам нужно использовать определенное имя класса модели, который «пользователь» вместо «Пользователь» в строке FindAll:

models = require('./../models'); 
exports.index = function (request, response, next) { 
    models.user.findAll({attributes: ['id', 'username']}); 
}; 

«Пользователь» - это переменная, которой назначено определение sequelize, и ее не распознается вне определения модели. «Пользователь» - это имя таблицы, которое создается, а также имя класса sequelize, и это нужно использовать в любом типе запроса db.

Смежные вопросы