【问题标题】:Error using NodeJS + SequelizeJS使用 Node JS + Sequelize JS 时出错
【发布时间】: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 将不会尝试再次创建您的表。

标签: node.js sequelize.js


【解决方案1】:

嗯,您的问题有几个问题。在某些方面,您使用 sequelize 的方式也不是设计者想要的方式。

1) CREATE TABLE.

正如@cgc 所提到的,#sync() 是一个初始化调用。把它想象成大爆炸。你只在开始时调用它一次,然后你把它拿走。

2) EventEmitter#success|ok 已弃用,请改用 promise-style。

请在此处参考我的 stackoverflow 答案: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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多