Methods 如何在Strongloop上为自定义远程方法设置自定义架构

Methods 如何在Strongloop上为自定义远程方法设置自定义架构,methods,model,response,loopbackjs,strongloop,Methods,Model,Response,Loopbackjs,Strongloop,我是Strongloop的新手,找不到有关如何自定义响应类(我构建的对象的模型架构)的信息,也不知道如何在API资源管理器上显示具有自定义数据的对象 例如,我有一个名为score的自定义远程方法 POST /Challenges/score 我想为参数data显示一个自定义模型模式,而不是单个参数,而不是质询的模型模式,正文中的数据具有所有参数,并在数据类型上向用户显示:model schema,这可能吗 { "id": "string", "limit": 0, "order"

我是Strongloop的新手,找不到有关如何自定义响应类(我构建的对象的模型架构)的信息,也不知道如何在API资源管理器上显示具有自定义数据的对象

例如,我有一个名为score的自定义远程方法

POST /Challenges/score
我想为参数
data
显示一个自定义模型模式,而不是单个参数,而不是质询的模型模式,正文中的数据具有所有参数,并在数据类型上向用户显示:model schema,这可能吗

{
  "id": "string",
  "limit": 0,
  "order": "string",
  "userId": "string"
}
另一方面,在Response类中,我想显示Response对象的模式。大概是这样的:

{
  "id":"string",
  "userId":"string",
  "user": {},
  "totalScore":0,
  "tags": []
}
我看了不同的问题(和),但找不到解决这个问题的方法

更新

下面是远程方法的定义

Challenge.remoteMethod('score', {
    accepts: { arg: 'data', type: 'object', http: { source: 'body' } },
    returns: {arg: 'scores', type: 'array'},
    http: {path: '/score', verb: 'post'}
});

我相信你可能已经看过strongloop的官方文件了。如果没有,下面的链接将解释远程方法及其接受的数据类型

假设您的自定义对象是挑战对象,要在响应中显示该对象,您必须指定类型(该类型可以是环回的数据类型之一,也可以是自定义模型)。因此,要返回挑战,您必须添加以下代码:

Challenge.remoteMethod('score', {
    accepts: { arg: 'data', type: 'object', http: { source: 'body' } },
    returns: {arg: 'scores', type: 'Challenge', root: true},
    http: {path: '/score', verb: 'post'}, 
});
指定的第二个箭头是要在API调用中尝试的默认值。您可以使用默认值作为键传递任何自定义字符串。 例如,如果要传递某个对象:

Challenge.remoteMethod('score', {
    accepts: {
        arg: 'data',
        type: 'object',
        default: '{
            "id": "string",
            "userId": "string",
            "user": {},
            "totalScore": 0,
            "tags": []
        }',
        http: {
            source: 'body'
        }
    },
    returns: {
        arg: 'scores',
        type: 'Challenge'
    },
    http: {
        path: '/score',
        verb: 'post'
    }
});

因此,对于响应,您不能自定义模型。但是要传递默认值,您可以将任何内容放在字符串格式中。

我发现解决此问题的方法是使用helper
slc loopback:model创建一个新模型

? Enter the model name: ArgChallenge
? Select the data-source to attach ArgChallenge to: (no data-source)
? Select model's base class PersistedModel
? Expose ArgChallenge via the REST API? No
? Common model or server only? server
我继续放置属性,然后在Challenge.js上:

Challenge.remoteMethod('score', {
    accepts: { arg: 'data', type: 'ArgChallenge', http: { source: 'body' } },
    returns: {arg: 'scores', type: 'array'},
    http: {path: '/score', verb: 'post'}
});
这就行了!如果有人知道更好的方法,请分享。

@jrltt,不要使用默认值,而是在accepts下使用指向类型的对象结构,它应该可以工作。注意,http源代码:body是必需的

随机对象:

Challenge.remoteMethod('score', {
    accepts: {
        arg: 'data',
        type: {
            "id": "string",
            "userId": "string",
            "user": {},
            "totalScore": 0,
            "tags": []
          },
        http: {
            source: 'body'
        }
    },
    returns: {
        arg: 'scores',
        type: 'Challenge'
    },
    http: {
        path: '/score',
        verb: 'post'
    }
});
使用定义的模型,该模型可在模型配置或使用环回模型生成器创建中使用,然后该模型名称可用于点类型。 因此,让我们使用用户模型在接受参数中显示

Challenge.remoteMethod('score', {
    accepts: {
        arg: 'data',
        type: 'User',
        http: {
            source: 'body'
        }
    },
    returns: {
        arg: 'scores',
        type: 'Challenge'
    },
    http: {
        path: '/score',
        verb: 'post'
    }
});

在环回中,远程参数可以标识使用ds.define('YourCustomModelName',dataFormat')定义的数据模型

因此,对于您的情况,在Challenge.js文件中编写一个函数,该文件将定义一个远程方法(在您的情况下score

在远程参数类型下,使用“类型”:“YourCustomModelName”

    Challenge.remoteMethod('score', {
        accepts: {
            arg: 'data',
            type: 'YourCustomModelName',
            http: {
                source: 'body'
            }
        },
        returns: {
            arg: 'scores',
            type: 'Challenge'
        },
        http: {
            path: '/score',
            verb: 'post'
        }
    });

重新启动服务器并刷新后,您应该会看到它在资源管理器上反映:)

我找到了一种方法,通过更改accepts数组中的type参数来解决此问题。 当我们创建远程方法时;我们提供接受数组。有arg、type、required和http。然后我们可以将请求对象放入类型参数中

示例代码

UserModel.remoteMethod(
“登录”,
{
描述:“使用用户名/电子邮件和密码登录用户。”,
接受:[
{
arg:'凭据',
键入:{'email':'string','password':'string'},
要求:正确,
http:{source:'body'},
},
{
arg:'include',类型:['string'],http:{source:'query'},
描述:“要包含在响应中的相关对象。”+
'有关详细信息,请参阅返回值的说明。',
},
],
返回:{
arg:'accessToken',类型:'object',根:true,
说明:
g、 f('响应正文包含登录时创建的{{AccessToken}}的属性。\n'+
'根据'include'参数的值,正文可能包含'+
'其他属性:\n\n'+
“-`user`-`U+007BUserU+007D`-当前登录用户的数据。”+
{{(`include=user`}}\n\n'),
},
http:{动词:'post'},
},
);

请告诉我们您是如何定义远程方法的。@RaymondCamden我已经用远程方法更新了问题OK,所以我在解析您的确切问题时遇到了问题。您是说您返回了一组自定义数据,并希望对其进行记录?如果是这样,您能否显示用于生成结果的代码(分数)?你是说要为输入定义“数据”吗?实际上,对于“接受”部分,你真的想要一个名为数据的对象,还是想要一组键/值对?我想你只是想要键/符对,因为你没有定义任何其他的SOK,也许我没有正确地解释自己。对于“accepts”部分,我需要一个名为data的对象,该对象具有自定义键/值对。类似于单个参数,但不是参数,而是对象主体内部的参数。对于响应,我想为我构建的对象展示一种方法(使用include或order等内部过滤器)。总之,我将explorer api提供给外部用户,然后他们使用定制服务,他们知道数据对象中要发送的键/值以及api响应对象。对不起!起初我认为这是一个简单的想法,但没有时间去尝试。昨天我尝试了一下,直到今天我都无法回答您,在定义默认值时,loopback忽略了它,并继续显示基本模型的结构
    Challenge.remoteMethod('score', {
        accepts: {
            arg: 'data',
            type: 'YourCustomModelName',
            http: {
                source: 'body'
            }
        },
        returns: {
            arg: 'scores',
            type: 'Challenge'
        },
        http: {
            path: '/score',
            verb: 'post'
        }
    });