2015-04-23 3 views
1

В моем sailsjs приложение, я пытаюсь добавить аватар по умолчанию для моего пользователя после того, как пользователь создал так у меня есть этот afterCreate крюк в models/User.js:Обновление не определено в sailsjs модели 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

+0

Создали ли вы это или же вы создаете его с парусами? Я не вижу, где вы экспортируете этот – tpie

+0

. Я добавил этот метод в класс пользователя после его создания с помощью sails-auth-generate – onetwopunch

ответ

2

Я думаю, что этот тип вещи Shou ld находиться внутри пользовательского контроллера, а не внутри модели. Ваша попытка изменить модель, которую вы определяете внутри модели, которую вы определяете.

Переместите его на контроллер и вызовите его в конце вашей функции createUser.

EDIT:

Попробуйте переместить функцию вне объекта атрибутов, и добавьте 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(); 
    } 
    } 
+1

. Я действительно не согласен с этой практикой дизайна, хотя сегодня я попробую, чтобы узнать, работает. Если я не могу добавить образ по умолчанию для пользователя в обратном вызове afterCreate, каким ИМО является то, где он должен быть, это кажется довольно большим недостатком дизайна Sails, поскольку вы можете сделать это в одной строке в Rails. – onetwopunch

+0

Хорошо .. позвольте мне взглянуть на генератора ... Я не знаком с тем, что он вам дает. Пакет auth, который я использую, не делает это совершенно так же. – tpie

+0

ОК, попробуйте ... Вот как он настроен в моей модели. – tpie

Смежные вопросы