2015-11-23 38 views
0

我正在使用express.js和sequelize開發小型應用程序。 現在我有一個問題。我去用this tutorial和stucked。通過githubExpress.js和Sequelize:未定義模型

'use strict'; 
module.exports = function(sequelize, DataTypes) { 
    var Article = sequelize.define('Article', { 
    title: DataTypes.STRING, 
    content: DataTypes.TEXT 
    }, { 
    classMethods: { 
     associate: function(models) { 
     // associations can be defined here 
     } 
    } 
    }); 
    return Article; 
}; 

我主項目,你可以看到有任何代碼:

我越來越

TypeError: Cannot read property 'findAll' of undefined 

router.get('/news', function (req, res, next) { 
    models.Article.findAll().then(function(article) { 
    res.json(article); 
    }); 
}); 

我的模型。

感謝您的幫助。

UPD:添加console.log(models)路由/新聞。

+0

你可以添加'的console.log(型號)''進/ news'路由器,並顯示它給我嗎? –

+0

我已經更新了您所要求的console.log文章。 – skad0

回答

1

該錯誤發生在models/index.js。在那裏有:

... 
.filter(function(file) { 
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); 
}) 
... 

這不包括以.js結尾的所有文件。將最終條件更改爲file.slice(-3) === '.js'意味着article.js不會被濾除。文章在article.js中定義。

要調試此我添加下面一行到你的路由器功能爲GET /news

console.log('KEYS TO models: ' + JSON.stringify(Object.keys(models))); 

這向我表明了模型的唯一成員是sequelize和Sequelize:

+0

謝謝,你在我寫類似的解決方案時發佈它,你在我前面一分鐘。 – skad0

0

它可能與命名約定有關,因爲Sequelize會將複數添加到模型名稱中。好的做法是在你的模型定義中使用複數名稱,這樣以後就不會在你的代碼中被欺騙。

嘗試將代碼和模型聲明中的文章更改爲文章。

+0

問題仍然存在:-(但thx回答和良好做法的建議 – skad0

0

調試後,我發現,默認models/index.js有錯誤。 當通過模型文件夾的文件迭代,有過濾器

(file.slice(-3) !== '.js') 

的情況這將返回false,如果文件的.js擴展,即uncorrect。 修復它到

(file.slice(-3) === '.js') 

它會工作。祝你好運!

完全正確的建設:

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