使用NodeJS + SequelizeJS时出错

时间:2015-03-26 15:00:01

标签: node.js sequelize.js

我使用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;

1 个答案:

答案 0 :(得分:0)

嗯,你的问题有几个问题。另外在某种程度上你使用续集,并不是设计师的意图。

1)CREATE TABLE

如@cgc所述,#sync()是一个初始化调用。把它想象成大爆炸。你只需要在开始时给它打一次,然后把它带走。

2)不推荐使用EventEmitter#success | ok,请改用promise-style。

请参阅我的stackoverflow答案:Sequelize associations - please use promise-style instead

您不应再使用#success()和#error()处理程序。然而,BC维持在他们身上。再说一遍,我不完全确定测试会对他们前进的影响有多好,你可能会遇到错误。

3)您可以通过返回Promises来简化代码。

您正在编写的流程可能会让您陷入困境。您有很多不同的方法来处理错误。

订阅简单的承诺流程。所有续集实例及其方法都将返回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);
}