Master Mind
Master Mind

Reputation: 3094

Strongloop : loopback beforeCreate not called

I have a model called question on which i defined beforeCreate and beforeUpdate methods to set createdAt and updatedAt timestamps.But it seems never called when i use the api explorer to create new Questions.

Here is my question.json:

{
  "name": "question",
  "plural": "questions",
  "base": "PersistedModel",
  "idInjection": true,
  "properties": {
    "title": {
    "type": "string",
    "required": true
   },
   "body": {
     "type": "string",
     "required": true
    },
   "views": {
      "type": "number"
    },
   "createdAt": {
    "type": "date",
  "required": true
},
"updatedAt": {
  "type": "date",
  "required": true
},
"id": {
  "type": "number"
 }
 },
 "validations": [],
 "relations": {
 "tags": {
  "type": "hasMany",
  "model": "tag",
  "foreignKey": "question_id"
   }
 },
 "acls": [],
 "methods": []
}

and question.js

module.exports = function(question) {
  question.beforeCreate = function (next, modelInstance) {
     modelInstance.createdAt = Date.now();
     modelInstance.updatedAt = Date.now();
     next();
 };
 question.beforeUpdate = function (next, modelInstance) {
     modelInstance.updatedAt = Date.now();
     next();
 };

};

The error i got when creating is :

  {
    "error": {
    "name": "ValidationError",
    "status": 422,
     "message": "The `question` instance is not valid. Details: `createdAt` can't be blank (value: undefined); `updatedAt` can't be blank (value: undefined).",
    "statusCode": 422,
    "details": {
    "context": "question",
     "codes": {
       "createdAt": [
       "presence"
      ],
    "updatedAt": [
      "presence"
    ]
  },
  "messages": {
    "createdAt": [
      "can't be blank"
    ],
    "updatedAt": [
      "can't be blank"
    ]
  }
},
"stack": "ValidationError: The `question` instance is not valid. Details: `createdAt` can't be blank (value: undefined); `updatedAt` can't be blank (value: undefined).\n    at /Users/dev/Desktop/workspace/stackclone/node_modules/loopback-datasource-juggler/lib/dao.js:252:12\n    at ModelConstructor.<anonymous> (/Users/dev/Desktop/workspace/stackclone/node_modules/loopback-datasource-juggler/lib/validations.js:460:11)\n    at ModelConstructor.next (/Users/dev/Desktop/workspace/stackclone/node_modules/loopback-datasource-juggler/lib/hooks.js:75:12)\n    at ModelConstructor.<anonymous> (/Users/dev/Desktop/workspace/stackclone/node_modules/loopback-datasource-juggler/lib/validations.js:457:23)\n    at ModelConstructor.trigger (/Users/dev/Desktop/workspace/stackclone/node_modules/loopback-datasource-juggler/lib/hooks.js:65:12)\n    at ModelConstructor.Validatable.isValid (/Users/dev/Desktop/workspace/stackclone/node_modules/loopback-datasource-juggler/lib/validations.js:433:8)\n    at /Users/dev/Desktop/workspace/stackclone/node_modules/loopback-datasource-juggler/lib/dao.js:248:9\n    at doNotify (/Users/dev/Desktop/workspace/stackclone/node_modules/loopback-datasource-juggler/lib/model.js:641:49)\n    at doNotify (/Users/dev/Desktop/workspace/stackclone/node_modules/loopback-datasource-juggler/lib/model.js:641:49)\n    at doNotify (/Users/dev/Desktop/workspace/stackclone/node_modules/loopback-datasource-juggler/lib/model.js:641:49)"
  }
}

my input is :

{
 "title": "title",
 "body": "body",
 "views": 0
}

Thanks in advance

Upvotes: 0

Views: 780

Answers (2)

khalib
khalib

Reputation: 31

Model hooks have been deprecated in favor of operation hooks:

http://docs.strongloop.com/display/public/LB/Operation+hooks

Porting to operation hooks is very minimal in your case:

module.exports = function(Question) {
  Question.observe('before save', function(context, next) {
    context.instance.createdAt = new Date(2014,2,2);
    context.instance.updatedAt = Date.now();
    next();
  });
};

Upvotes: 3

Anuj Verma
Anuj Verma

Reputation: 2889

Can you try this way in question.js

module.exports = function(Question) {
  Question.beforeRemote('create', function(context, user, next) {
    var req = context.req;
    req.body.createdAt = new Date(2014,2,2);
    req.body.updatedAt = Date.now();
    next();
  });
};

Upvotes: 1

Related Questions