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

时间:2015-07-06 20:19:11

标签: node.js api relationship strongloop loopback

所以我设置了一些非常简单的东西来学习如何使用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: personId)
food_pref belongs to food_type (foreign key: typeId)

创建一个自动生成的方法,该方法根据Person的id返回food_prefs。

People/{id}/foodPrefs

返回:

[
  {
    "typeId": 0,
    "personId": 0,
    "id": 0
  }
]

我想要做的是添加一个名为“getPrefs”的单独远程方法,该方法根据food_pref中的typeId返回food_type下的类型名称。

所以让我们说typeId是1而food_types中的id是Italian Food然后远程方法会返回这个:

{
  "type": "Italian Food"
}

我被告知要使用Person.js并在这些行中添加一些东西,但我对include语句以及括号内的操作感到困惑。通常它会因错误而崩溃:错误:没有为Person模型定义关系“food_pref”,请参阅下面的建议:

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'}
        }
    );
};

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

修改

根据strongloop documentation定义个人远程方法时,strongloop会自动提供回调,如果需要,将返回数据。 见下面更新的代码

您希望在food_pref中包含food_pref关系以及food_type realation。将此内容添加到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.remoteMethod(
    'getPrefs', {
        http: {path: '/:personId/getPrefs', verb: 'get'},
        accepts: [{arg: 'personId', type: 'number'}],
        returns: {arg: 'person', type: 'object'},
        description: ['a person object']
    }
);

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

如果您只想要食物名称,请使用不同的方法遵循相同的想法:

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

  • 直接在food_type表中搜索“where”条件(其中personId =您要查找的人的ID)

请查看strongloop doc链接中的链接,因为它非常详细,并且有关远程方法的详细信息。

希望它有所帮助。