Search code examples
loopbackjsstrongloop

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


Solution

  • 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();
      });
    };