【问题标题】:Update undefined in sailsjs model afterCreate hook在创建钩子之后更新sailsjs模型中的未定义
【发布时间】:2015-07-01 01:06:03
【问题描述】:

在我的sailsjs 应用程序中,我试图在创建用户后为我的用户添加一个默认头像,所以我在models/User.js 中有这个afterCreate 挂钩:

var User = {
  // ...
  attributes: {
    avatar: { model: 'Image' },
    // ...
  },
  afterCreate: function(user, next){
    var url =  sails.config.s3 + "/" + sails.config.default_avatar;
    sails.log.info(user); // This displays the proper user
    var data = { url: url, isAvatar: true, user: user.id };

    Image.create(data) 
    .exec( function (err, image) {
      sails.log.info(image); // This displays the proper image
      User.update(image.user, { avatar: image.id})
      .exec( sails.log.info );
    });
    next();
  },   
}

我不断收到错误:

 /Users/rcanty/Workspace/project/server/api/models/User.js:55
  return User.update(image.user, { avatar: image.id}).exec( sails.log.info
              ^
TypeError: undefined is not a function
    at /Users/rcanty/Workspace/project/server/api/models/User.js:55:19   
at bound (/usr/local/lib/node_modules/sails/node_modules/lodash/dist/lodash.js:957:21)
at applyInOriginalCtx (/usr/local/lib/node_modules/sails/node_modules/waterline/lib/waterline/utils/normalize.js:416:80)
at wrappedCallback (/usr/local/lib/node_modules/sails/node_modules/waterline/lib/waterline/utils/normalize.js:315:18)
at callback.success (/usr/local/lib/node_modules/sails/node_modules/waterline/node_modules/switchback/lib/normalize.js:33:31)
at _switch (/usr/local/lib/node_modules/sails/node_modules/waterline/node_modules/switchback/lib/factory.js:48:28)
at /usr/local/lib/node_modules/sails/node_modules/waterline/lib/waterline/query/dql/create.js:241:9
at /usr/local/lib/node_modules/sails/node_modules/async/lib/async.js:157:25
at bound.<anonymous> (/usr/local/lib/node_modules/sails/node_modules/waterline/lib/waterline/utils/schema.js:151:44)
at fn (/usr/local/lib/node_modules/sails/node_modules/waterline/lib/waterline/utils/callbacksRunner.js:60:10)
at iterate (/usr/local/lib/node_modules/sails/node_modules/async/lib/async.js:149:13)
at Object.async.eachSeries (/usr/local/lib/node_modules/sails/node_modules/async/lib/async.js:165:9)
at Object.runner.afterCreate (/usr/local/lib/node_modules/sails/node_modules/waterline/lib/waterline/utils/callbacksRunner.js:63:9)
at after (/usr/local/lib/node_modules/sails/node_modules/waterline/lib/waterline/query/dql/create.js:236:17)
at /usr/local/lib/node_modules/sails/node_modules/waterline/lib/waterline/query/dql/create.js:223:67
at bound (/usr/local/lib/node_modules/sails/node_modules/lodash/dist/lodash.js:957:21)

但是,我似乎完全按照waterline docs 中的规定进行操作

【问题讨论】:

  • 这个是你创造的还是你用风帆生成的?我没有看到你在哪里导出这个
  • 这个方法是由sails-auth-generate生成后添加到用户类中的

标签: javascript node.js orm sails.js waterline


【解决方案1】:

我认为这种类型的东西应该在您的用户控制器中,而不是在模型中。您尝试修改您正在定义的模型中定义的模型。

将其移至控制器并在您的 createUser 函数结束时调用它。

编辑:

尝试将函数移到属性对象之外,并添加var User = this;,使其可以引用自身:

  var User = {
    // ...
    attributes: {
      avatar: {model: 'Image'},
      // ...
    },
    afterCreate: function(user, next){
      var url =  sails.config.s3 + "/" + sails.config.default_avatar;
      sails.log.info(user); // This displays the proper user
      var data = { url: url, isAvatar: true, user: user.id };
      var User = this; // for internal reference

      Image.create(data)
          .exec( function (err, image) {
            sails.log.info(image); // This displays the proper image
            User.update(image.user, { avatar: image.id})
                .exec( sails.log.info );
          });
      next();
    }
  }

【讨论】:

  • 我实际上不同意这种设计做法,尽管我今天会尝试一下,看看它是否有效。如果我不能在 afterCreate 回调中向用户添加默认图像,IMO 应该在哪里,这似乎是一个很大的 Sails 设计缺陷,因为您可以在 Rails 中的一行中完成此操作。
  • 嗯..等等,让我看看那个生成器......我不熟悉它给你的东西。我使用的 auth 包并没有完全一样的方式。
  • 顺便说一句,我还没有测试过,但从内部引用模型似乎仍然不可行。
  • 非常感谢,但实际上这是我在帖子中的一个错误,而不是代码。我实际上已经有了属性之外的方法。感谢您的建议,我在对图像的调用之外添加了var User = this 行,现在它可以工作了。如果您更新答案以反映这一点,我会接受。谢谢:)
  • 是的,我刚刚测试过。如果您记录用户的 this,您将看到更新功能。您是对的,因为用户尚未在 Image 回调上下文中定义,因为它尚未导出,这发生在文件末尾。
猜你喜欢
  • 1970-01-01
  • 2021-11-27
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 2015-12-07
  • 1970-01-01
  • 2020-06-01
相关资源
最近更新 更多