【问题标题】:How do I use a remote method in one model to return info from another model?如何在一个模型中使用远程方法从另一个模型返回信息?
【发布时间】:2015-09-24 03:10:14
【问题描述】:

所以我设置了一些非常简单的东西来学习如何使用 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 1 是意大利食品,那么远程方法将返回:

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

我在这里做错了什么?

【问题讨论】:

    标签: node.js api relationship strongloop loopback


    【解决方案1】:

    编辑:

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

    您想在这个 food_pref 中包含 food_pref 关系以及 food_type 关系。将其放入您的 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”并获取数据(这里人发现)

    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”(并修改注册以宣布您的方法发送的返回类型)

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

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

    希望对您有所帮助。

    【讨论】:

    • 啊,但是我用什么来从 food_type 表中发送回类型?我知道我应该做类似 cb(null, variable); 之类的事情。但我不知道如何将结果存储到变量中以发送回响应。现在它什么也不做,就像你上面所说的那样。
    • 澄清一下,包含文档中的任何地方都没有说明如何将结果发回或从查询中取出。我试过 var results = Person.findById(pers... etc... 但这不起作用。
    • 我为您提供了更多详细信息。虽然我认为这应该实现您正在寻找的东西:获取食物类型的名称,但请记住,还有其他方法可以做到这一点,正如稍后在回复中提到的那样。如果需要,我会尽力为您提供更多详细信息。
    • 这行得通,但是有什么方法可以只获取 food_type 结果,而不是获取包含所有其他信息的整个嵌套 json 字符串?我意识到你提到能够做到这一点,我只是不明白你所说的关于注册的任何内容。
    • Loopback 模型有一个名为“remoteMethod()”的静态方法,用于注册您自己的远程方法。这就是上面代码的第二部分的用途。此静态方法的第二个参数是一系列选项,例如您自己的远程方法返回的数据类型。在上面的示例中,我返回了一个对象,并在注册方法时告知。您可以将“cb(null, personFound)”替换为“cb(null, personFound.food_pref.food_type.name)”(或对象中的任何名称)和“returns: {arg: 'person', type:' object'}" by "returns: {arg: 'person', type: 'string'}"
    猜你喜欢
    • 1970-01-01
    • 2017-07-03
    • 2022-01-15
    • 2019-06-20
    • 1970-01-01
    • 2021-01-05
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多