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

标签 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)

创建一个自动生成的方法,该方法根据人员的 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'}
        }
    );
};

我在这里做错了什么?

最佳答案

编辑:

根据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 文档链接中的链接,因为它关于远程方法的内容非常漂亮且详细。

希望有帮助。

关于node.js - 如何在一个模型中使用远程方法从另一个模型返回信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31254864/

相关文章:

mysql - 根据条件查询列出用户并按其他条件的计数排序

sql - Laravel Eloquent 在每个数据透视表字段条件下获取多对多关系

mysql - NodeJS 应用程序查询有时会挂起,直到修改 cmd 行

javascript - 如何通过纯 NodeJS 从 MongoDB 读取数据?

php - 是否有包含大多数已知危险用户输入的列表? PHP/MySQL

ruby-on-rails - 使用 Rspec,如何在 Rails 3.0.11 中测试我的 Controller 的 JSON 格式?

python - 在 Python 中,使用哪种架构与第三方 Web API 进行交互?

java - Google App Engine for Java 中的多对多关系(与属性)

node.js - 使用passport.js在node.js中进行身份验证后重定向到上一页

node.js - 输入 'sudo npm install -g meteorite' 时出错