Loopback远程方法调用Realm模型返回undefined问题排查求助
分析与解决Loopback中Realm.find返回undefined的问题
作为Loopback新手,碰到这种回调里返回undefined的情况确实头疼,我帮你梳理下几个关键问题:
1. Model.find的参数顺序错误(核心原因)
Loopback 3中Model.find()的正确参数顺序是:find(filter, options, callback)(若不需要options,可简化为find(filter, callback))。但你的代码里把options放在了第一个参数位置,filter放在第二个,这会导致Realm模型接收到的查询参数完全错误,自然查不到数据,返回undefined。
比如这段代码:
serviceOffering.app.models.Realm.find(options, getOrgFil, function (err, resl) { ... })
这里把options(本该是第二个参数)放到了filter的位置,getOrgFil(本该是第一个参数的查询条件)放到了options的位置,Realm模型根本无法识别正确的查询规则,所以返回空的resl。
2. 未处理回调中的错误信息
你的代码里完全没检查err参数,就算查询过程中出错了(比如Realm模型字段名写错、权限不足),你也看不到错误信息,这会让调试变得毫无方向。
3. 代码格式过于紧凑,不利于调试
你的代码全部挤在一起,变量命名也比较随意(比如resl、arry),建议格式化代码,这样更容易发现参数顺序、语法这类基础错误。
修改后的代码示例
我帮你修正了参数顺序,添加了错误处理,同时格式化了代码:
var loopback = require('loopback'); var serviceOffering = loopback.getModelByType('ServiceOffering'); var app = require('../../server/server.js'); module.exports = function (serviceOffering) { serviceOffering.GetAllOfferings = function (category, options, callback) { // 修正remoteMethod参数顺序:category在前,options在后 var filter = JSON.parse(JSON.stringify(category)); var createdByList = []; var realmFilter = { where: { or: [] } }; // 修正serviceOffering.find的参数顺序:filter在前,options在后 serviceOffering.find(filter, options, function (err, serviceResults) { // 先处理ServiceOffering查询错误 if (err) { console.error('查询ServiceOffering出错:', err); return callback(err); } console.log('serviceResults:', serviceResults); for (var i = 0; i < serviceResults.length; i++) { var item = serviceResults[i]; if (createdByList.indexOf(item._createdBy) === -1) { createdByList.push(item._createdBy); realmFilter.where.or.push({ UserName: item._createdBy }); } } console.log('realmFilter:', realmFilter); console.log('stringified realmFilter:', JSON.stringify(realmFilter)); // 修正Realm.find的参数顺序:查询条件在前,options在后 serviceOffering.app.models.Realm.find(realmFilter, options, function (err, realmResults) { // 处理Realm查询错误 if (err) { console.error('查询Realm出错:', err); return callback(err); } console.log('realmResults:', realmResults); return callback(null, realmResults); }); }); }; serviceOffering.remoteMethod( 'GetAllOfferings', { http: { path: '/GetAllOfferings', verb: 'get' }, accepts: [ { arg: 'category', type: 'object', http: { source: 'query' } }, // 必须声明options参数并指定source为context,否则无法获取到上下文信息 { arg: 'options', type: 'object', http: { source: 'context' } } ], returns: { type: 'array', root: true } } ); };
额外检查点
- 确认Realm模型中确实存在
UserName字段,字段名大小写要完全匹配(Loopback字段名区分大小写)。 - 检查Realm模型的权限配置,确保当前调用用户有
find权限。 - 确认
options参数是否正确传递,remoteMethod的accepts里必须声明options并指定source: 'context',否则会拿到undefined的options。
内容的提问来源于stack exchange,提问作者N29
相关产品推荐
相关产品推荐

