使用 Node JS + Sequelize JS 时出错
Posted
技术标签:
【中文标题】使用 Node JS + Sequelize JS 时出错【英文标题】:Error using NodeJS + SequelizeJS 【发布时间】:2015-03-26 15:00:00 【问题描述】:我在使用 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;
;
以及当前模型的道:
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;
【问题讨论】:
检查您是否在代码中的某处调用sync()
。
是的,我在DbContext
...中调用了sync()...
那是你的问题。 :) 当您致电sync()
时,Sequelize 将尝试将您的数据库与您在 Sequelize 模型中的定义同步(惊喜!)。我不确切知道sync() 的所有后果,但是删除它,您可能会注意到CREATE TABLE 语句不再存在。
好的,我删除了sync()
函数,但是如果我删除所有表,我的脚本会重新创建所有表吗?
不。如果您删除sync()
,则 Sequelize 将不会尝试再次创建您的表。
【参考方案1】:
嗯,您的问题有几个问题。在某些方面,您使用 sequelize 的方式也不是设计者想要的方式。
1) CREATE TABLE
.
正如@cgc 所提到的,#sync() 是一个初始化调用。把它想象成大爆炸。你只在开始时调用它一次,然后你把它拿走。
2) EventEmitter#success|ok 已弃用,请改用 promise-style。
请在此处参考我的 *** 答案:Sequelize associations - please use promise-style instead
您不应再使用#success() 和#error() 处理程序。但是,BC 保留在它们上。再说一次,我不完全确定测试将在多大程度上覆盖它们,你可能会遇到错误。
3) 你可以通过返回 Promises 来简化你的代码。
您正在编写的流程可能会给您带来麻烦。你有很多不同的方法来处理你的错误。
改为订阅一个简单的承诺流程。所有 sequelize 实例及其方法都将返回 Promise。这些 Promise 可以返回到父 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);
【讨论】:
以上是关于使用 Node JS + Sequelize JS 时出错的主要内容,如果未能解决你的问题,请参考以下文章
使用 Node.js/Sequelize 进行批量插入时 PostgreSQL 崩溃
Node.js:如何在 Sequelize 中使用 Postgres 存储过程?
Node.js / Sequelize.js / Express.js - 如何插入多对多关联? (同步/异步?)