我使用SequelizeJS和NodeJS时遇到了问题。
执行npm bin/www
命令时出现错误消息:
EventEmitter#success|ok is deprecated, please use promise-style instead.
Executing (default): CREATE TABLE IF NOT EXISTS `ArticleCategories` (`id` INTEGER NOT NULL auto_increment , `name` VARCHAR(255), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing (default): SHOW INDEX FROM `ArticleCategories`
我不明白为什么执行CREATE TABLE
因为我的桌子已经就位了......
我的模特:
module.exports = function (db, Types) {
var ArticleCategory = db.define('ArticleCategory', {
name: {
type: Types.STRING
},
}, {
classMethods:{
associate: function (models) {
ArticleCategory.hasMany(models.Article);
}
}
});
return ArticleCategory;
};
当前模特的dao:
var dbContext = require('./../../db/DbContext');
var _ = require('lodash');
var ArticleCategoryDao = function () {
this.context = dbContext.entities;
};
_.extend(ArticleCategoryDao.prototype, {
getAll: function (callback) {
return this.context.ArticleCategory.findAll({include: [{ model: this.context.Article}]});
},
get: function (id, callback) {
return this.context.ArticleCategory.find(id);
},
save: function(properties, callback){
this.context.ArticleCategory.create(properties)
.success(function (category) {
callback(null, category);
})
.error(function (error) {
callback(error, null);
});
},
update: function (properties, callback) {
this.get(properties.id).success(function (category) {
if(category){
category.updateAttributes(properties).success(function (category) {
callback(null, category);
}).error(function (error) {
callback(error, category);
});
}else{
callback('Aucune catégorie avec l\'id :' + properties.id, null);
}
});
},
delete: function (id, callback) {
this.context.ArticleCategory.find(id).success(function (category) {
if(category){
category.destroy().success(callback);
}
else{
callback('Aucune catégorie avec l\'id :' + id);
}
})
.error(callback);
}
});
module.exports = ArticleCategoryDao;
答案 0 :(得分:0)
嗯,你的问题有几个问题。另外在某种程度上你使用续集,并不是设计师的意图。
CREATE TABLE
。如@cgc所述,#sync()是一个初始化调用。把它想象成大爆炸。你只需要在开始时给它打一次,然后把它带走。
请参阅我的stackoverflow答案:Sequelize associations - please use promise-style instead
您不应再使用#success()和#error()处理程序。然而,BC维持在他们身上。再说一遍,我不完全确定测试会对他们前进的影响有多好,你可能会遇到错误。
您正在编写的流程可能会让您陷入困境。您有很多不同的方法来处理错误。
订阅简单的承诺流程。所有续集实例及其方法都将返回promise。这些承诺可以返回到父承诺链,这样您就可以只有1个“成功”和“错误”处理程序。而且你总是喜欢使用throw
将错误传递给你的1和唯一的错误处理函数。
重写#delete()方法的示例:
delete: function (id, callback) {
// returns this parent promise to its caller
return this.context.ArticleCategory.find(id).then(function (category) {
if (!category) throw 'Aucune catégorie avec l\'id :' + id;
// returns category promise back to its parent promise
return category.destroy().then(callback);
})
// all errors within this parent promise scope will bubble up this this one catch handler.
.catch(callback);
}
随后,您的#update()方法也可以重写:
update: function (properties, callback) {
return this.context.find(properties.id).then(function(category) {
if(!category) throw 'Aucune catégorie avec l\'id :' + properties.id';
//don't need the id attribute. optional, but i feel deleting it is better.
delete properties.id
return category
.updateAttributes(properties)
.then(function(category) {
callback(null, category);
});
}).catch(callback);
}