我如何在一个模型中使用远程方法从另一个模型中获取 return 信息?
How do I use a remote method in one model to return info from another model?
所以我设置了一些非常简单的东西来学习如何使用 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)
一个自动生成的方法被创建,returns food_prefs 基于 Person 的 id。
People/{id}/foodPrefs
这个returns:
[
{
"typeId": 0,
"personId": 0,
"id": 0
}
]
我想要做的是添加一个名为 "getPrefs" 的单独的远程方法,该方法 return 是 food_type 下的类型名称,基于 food_pref 中的 typeId .
假设 typeId 为 1,food_types 中的 id 1 为意大利美食,那么远程方法将 return 为:
{
"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 会自动提供一个回调,如果需要,该回调将 return 发送数据。
请参阅下面更新的代码
您想在此 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']
}
);
然后 returned 对象应该包含食物类型的名称。
确保在 Person.json 等中包含正确的关系名称。
如果你只是想要食物首选项的名字,同一个思路,不同的方法:
只需将对象内部的字符串发送到自动回调参数'cb'(并修改注册以声明您的方法发送的类型return)
直接在 food_type table 中搜索 "where" 条件(其中 personId = 您要查找的人的 ID)
查看 link to strongloop 文档中的 link,因为它关于远程方法非常详细。
希望对您有所帮助。
所以我设置了一些非常简单的东西来学习如何使用 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)
一个自动生成的方法被创建,returns food_prefs 基于 Person 的 id。
People/{id}/foodPrefs
这个returns:
[
{
"typeId": 0,
"personId": 0,
"id": 0
}
]
我想要做的是添加一个名为 "getPrefs" 的单独的远程方法,该方法 return 是 food_type 下的类型名称,基于 food_pref 中的 typeId .
假设 typeId 为 1,food_types 中的 id 1 为意大利美食,那么远程方法将 return 为:
{
"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 会自动提供一个回调,如果需要,该回调将 return 发送数据。 请参阅下面更新的代码
您想在此 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']
}
);
然后 returned 对象应该包含食物类型的名称。 确保在 Person.json 等中包含正确的关系名称。
如果你只是想要食物首选项的名字,同一个思路,不同的方法:
只需将对象内部的字符串发送到自动回调参数'cb'(并修改注册以声明您的方法发送的类型return)
直接在 food_type table 中搜索 "where" 条件(其中 personId = 您要查找的人的 ID)
查看 link to strongloop 文档中的 link,因为它关于远程方法非常详细。
希望对您有所帮助。