0
votes

I have generated remote method using

slc loopback:remote-method

I tried to access this method from explorer and it give status 400 with message "phoneNumber is a required arg"

When I tried with postman it gives status 500 with message Internal sever error. I tried sending post data as form, x-www-form-urlencoded encoded, and row, it gives same result.

Server side error:

Unhandled error for request POST /otp/getOTP: TypeError: Cannot read property 'modelName' of null
at convertToBasicRemotingType (/Users/manish/Documents/workspace-node/carbuk-services/node_modules/loopback/node_modules/strong-remoting/lib/shared-method.js:390:16)
at /Users/manish/Documents/workspace-node/carbuk-services/node_modules/loopback/node_modules/strong-remoting/lib/shared-method.js:544:20
at Array.filter (native)
at Function.SharedMethod.toResult (/Users/manish/Documents/workspace-node/carbuk-services/node_modules/loopback/node_modules/strong-remoting/lib/shared-method.js:534:21)
at callback (/Users/manish/Documents/workspace-node/carbuk-services/node_modules/loopback/node_modules/strong-remoting/lib/shared-method.js:249:31)
at Function.Onetimepassword.getOTP (/Users/manish/Documents/workspace-node/carbuk-services/common/models/one-time-password.js:14:4)
at SharedMethod.invoke (/Users/manish/Documents/workspace-node/carbuk-services/node_modules/loopback/node_modules/strong-remoting/lib/shared-method.js:263:25)
at HttpContext.invoke (/Users/manish/Documents/workspace-node/carbuk-services/node_modules/loopback/node_modules/strong-remoting/lib/http-context.js:387:12)
at phaseInvoke (/Users/manish/Documents/workspace-node/carbuk-services/node_modules/loopback/node_modules/strong-remoting/lib/remote-objects.js:644:9)
at runHandler (/Users/manish/Documents/workspace-node/carbuk-services/node_modules/loopback/node_modules/loopback-phase/lib/phase.js:135:5)
at iterate (/Users/manish/Documents/workspace-node/carbuk-services/node_modules/loopback/node_modules/async/lib/async.js:146:13)
at Object.async.eachSeries (/Users/manish/Documents/workspace-node/carbuk-services/node_modules/loopback/node_modules/async/lib/async.js:162:9)
at runHandlers (/Users/manish/Documents/workspace-node/carbuk-services/node_modules/loopback/node_modules/loopback-phase/lib/phase.js:144:13)
at iterate (/Users/manish/Documents/workspace-node/carbuk-services/node_modules/loopback/node_modules/async/lib/async.js:146:13)
at /Users/manish/Documents/workspace-node/carbuk-services/node_modules/loopback/node_modules/async/lib/async.js:157:25
at /Users/manish/Documents/workspace-node/carbuk-services/node_modules/loopback/node_modules/async/lib/async.js:154:25

model json look like this

{   
    "name": "OneTimePassword",   
    "plural": "otp",   
    "base": "PersistedModel",   
    "idInjection": true,   
    "options": {
       "validateUpsert": true
    },   
    "properties": {
       "phoneNumber": {
          "type": "number",
          "required": true
       },
    "otpNumber": {
      "type": "number",
      "required": true
    },
    "resendCounter": {
      "type": "number",
      "default": "0"
    },
    "createdDate": {
      "type": "date"
    }   },   "validations": [],   "relations": {},   "acls": [
    {
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "DENY"
    },
    {
      "accessType": "EXECUTE",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "ALLOW",
      "property": "deleteById"
    },
    {
      "accessType": "EXECUTE",
      "principalType": "ROLE",
      "principalId": "$everyone",
      "permission": "ALLOW",
      "property": "getOTP"
    }   ],   "methods": {
    "getOTP": {
      "accepts": [
        {
          "arg": "phoneNumber",
          "type": "number",
          "required": true,
          "description": "phone number",
          "http": {
            "source": "form"
          }
        }
      ],
      "returns": [
        {
          "arg": "oneTimePassword",
          "type": null,
          "root": true,
          "description": "otp"
        }
      ],
      "description": "generate otp and send sms",
      "http": [
        {
          "path": "/getOTP",
          "verb": "post"
        }
      ]
    }   } }

model js:

    module.exports = function(Onetimepassword) {
    /**
     * generate otp and send sms
     * @param {number} phoneNumber phone number
     * @param {Function(Error, )} callback
     */
    Onetimepassword.getOTP = function(phoneNumber, callback) {
      var oneTimePassword = {};
      oneTimePassword.phoneNumber = phoneNumber;
      // TODO
      // logic will come here
      // 
      callback(null, oneTimePassword);
    };
   };

Am I missing something?

2

2 Answers

1
votes

You have a typo.

in line oneTimePassword.phoneNumber = phoneNumber; you need to set to optNumber

0
votes

I found the solution.

In model.json, Remote method's return type is null. I changed this to object type "OneTimePassword"

But still I am not able to hit the remote method from explorer. There is a bug issue#440.

Using postman, request work fine