2015-11-23 37 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; 
    });