使用 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 - 如何插入多对多关联? (同步/异步?)

如何使用 Sequelize 和 node.js 进行批量插入

使用 Node JS + Sequelize JS 时出错

[转]Node.JS使用Sequelize操作MySQL