【问题标题】:Sequelize create function not working as expectedSequelize 创建功能未按预期工作
【发布时间】:2018-11-19 05:19:55
【问题描述】:

我按照这个规范在模型上创建了一个实例函数:

describe('Instance methods', function() {
    var task;

    beforeEach(function() {
      return Task.create({
        name: 'task',
      }).then(function(_task) {
        task = _task;
      });
    });

    describe('addChild', function() {
      it('should return a promise for the new child', function() {
        return task.addChild({ name: 'task2' }).then(function(child) {
          expect(child.name).to.equal('task2');
          expect(child.parentId).to.equal(task.id);
        });
      });
    });
..... more not applicable
  });

就是这样,但我不会回来......

Task.prototype.addChild = function(task) {
  return Task.create(task.name).then(function(task) {
    console.log('task', task);
    return task;
  });
};

如规范中所述:

应该为新孩子返回一个承诺

根据控制台:

任务实例方法 addChild 应该返回一个新的承诺 孩子:

这是我返回的错误:

SequelizeValidationError: Validation Error

那么我做错了什么没有在数据库中添加这个任务? 我没有正确使用create 方法吗?

提前致谢!

更新

我试过这个:

Task.prototype.addChild = function(task) {   var task = Task.build({
name: task['name'] });   return task.save(); };

但我要回来了,

AssertionError: expected null to equal 1

【问题讨论】:

    标签: sequelize.js


    【解决方案1】:

    他们是我认为在你的实施中的一些错误:

    根据您的测试,任务是用名称和 parentId 描述的。 但是当您创建任务时,您会通过 addChild { name: 'toto' } 而你直接传入Task.create task.name 是不行的,该方法尝试接收一个对象。

    所以不是那个

    Task.prototype.addChild = function(task) {
        return Task.create(task.name).then(function(task) {
            console.log('task', task);
            return task;
        });
    };
    

    试试这个:

    Task.prototype.addChild = function(task) {
        return Task.create(task).then(function(task) {
            console.log('task', task);
            return task;
        });
    };
    
    // Than you call like this
    await Task.addChild({
        name: 'name',
        parentId: 1
    });
    
    // OR
    
    Task.addChild({
        name: 'name',
        parentId: 1
    }).then(() => // something);
    

    【讨论】:

      【解决方案2】:

      create 方法接受一个可选参数,它是 create 方法的结果对象。除了将新任务实例的名称分配给 task.name 之外,您还必须传入作为新任务实例外键的 parentId。使用“1”将帮助您通过此规范,但您需要使用 this.id(this,作为调用 addChild 方法的初始实例)。

      Task.prototype.addChild = function(task) {
        return Task.create({
          name: task.name,
          parentId: this.id
        });
      }
      

      【讨论】:

        猜你喜欢
        • 2018-03-12
        • 2013-08-29
        • 2020-04-28
        • 2021-08-27
        • 1970-01-01
        • 2012-10-07
        • 2014-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多