Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在一个模型中使用远程方法从另一个模型返回信息?_Node.js_Api_Relationship_Strongloop_Loopback - Fatal编程技术网

Node.js 如何在一个模型中使用远程方法从另一个模型返回信息?

Node.js 如何在一个模型中使用远程方法从另一个模型返回信息?,node.js,api,relationship,strongloop,loopback,Node.js,Api,Relationship,Strongloop,Loopback,所以我设置了一些非常简单的东西来学习如何使用环回 模型如下: Person - based on built in User model food_pref typeId (number) personId (number) food_type type (string) 关系: Person has many food_prefs (foreign key: personId) food_pref belongs to Person (foreign key: pe

所以我设置了一些非常简单的东西来学习如何使用环回

模型如下:

Person 
   - based on built in User model
food_pref
   typeId (number)
   personId (number)
food_type
   type (string)
关系:

Person has many food_prefs (foreign key: personId)
food_pref belongs to Person (foreign key: personId)
food_pref belongs to food_type (foreign key: typeId)
将创建一个自动生成的方法,该方法根据人的id返回食物前缀

People/{id}/foodPrefs
这将返回:

[
  {
    "typeId": 0,
    "personId": 0,
    "id": 0
  }
]
我要做的是添加一个名为“getPrefs”的单独远程方法,该方法根据food\u pref中的typeId返回food\u type下类型的名称

假设typeId为1,而food_types中的id为1是意大利食品,那么远程方法将返回:

{
  "type": "Italian Food"
}
我被告知使用Person.js并添加一些类似的内容,但我对include语句以及括号内的操作感到非常困惑。它经常会崩溃,错误是:error:relationship“food_pref”没有为Person模型定义,请参见下面他们的建议:

module.exports = function(Person) {
 Person.getPrefs = function(personId, cb) {
 Person.findById(personId, { include: { food_pref: "food_type" } }, function(err, user) {
    if (err) throw err;
 });
 }

 Person.remoteMethod (

        'getPrefs',
        {
          http: {path: '/getPrefs', verb: 'get'},
          accepts: {arg: 'personId', type: 'number', http: { source: 'query' } },

          returns: {arg: 'type', type: 'string'}
        }
    );
};
我做错了什么?

编辑:

根据定义个人远程方法的时间,strongloop会自动提供回调,在需要时返回数据。 请参阅下面更新的代码

您希望在此food_pref中包含food_pref关系以及food_类型。请将其放入getPrefs自定义方法中:

Person.getPrefs = function(personId, cb) {
    Person.findById(personId, {
        include: [{
            relation: 'food_pref',
            scope: {
                include: {
                    relation: 'food_type'
                }}}
        ]},
        function(err, personFound) {
            if (err)
                console.log(err);
            else {
                cb(null, personFound)
            }
        });
};
它的作用:使用personId参数和cb参数(由strongloop自动传递!)调用您的个人方法。您的方法通过id找到合适的人,包括关系(食物类型的名称),然后在获取结果时,“person.findById”中的回调调用回调“cb”,并获取数据(此处为personFound)

然后返回的对象应该包含食物类型的名称。 确保在Person.json等文件中包含正确的关系名

如果您只想知道food pref的名称,请使用不同的方法遵循相同的想法:

  • 只需将对象中的字符串发送到自动回调参数“cb”(并修改注册以宣布方法发送的返回类型)

  • 直接在带有“where”条件的食物类型表中搜索(其中personId=您要查找的人的id)

查看strongloop文档链接中的链接,因为它非常详细地介绍了远程方法


希望能有帮助。

Ahhh,但是我用什么从食物类型表中返回类型?我知道我应该做一些像cb(null,variable)的事情;但我不知道如何将结果存储到一个变量中,以便将响应发送回。现在它没有做任何事情,正如你上面所说的。为了澄清,在include文档中没有任何关于如何返回结果或从查询中获取结果的指示。我尝试了var results=Person.findById(pers…等…但这不起作用。我编辑以提供更多详细信息。虽然我认为这应该可以实现您所寻找的:获取食物类型的名称,但请记住,还有其他方法可以做到这一点,如后面的回复中所述。如果需要,我将尝试提供更多详细信息。这是可行的,但是否有某种方法可以实现这一点e food_type结果,而不是整个嵌套的json字符串,其中包含所有其他信息?我知道您提到了能够做到这一点,我只是不理解您所说的关于注册的任何内容。环回模型有一个名为“remoteMethod()”的静态方法用于注册您自己的远程方法。这是上面代码的第二部分的用途。此静态方法的第二个参数是一系列选项,例如您自己的远程方法返回的数据类型。在上面的示例中,我返回一个对象,并在注册该方法时告诉您。您可以替换“cb”(null,personFound)“由cb(null,personFound.food_pref.food_type.name)”和“返回:{arg:'person',type:'object'}”由“返回:{arg:'person',type:'string'}”
Person.remoteMethod(
    'getPrefs', {
        http: {path: '/:personId/getPrefs', verb: 'get'},
        accepts: [{arg: 'personId', type: 'number'}],
        returns: {arg: 'person', type: 'object'},
        description: ['a person object']
    }
);