我正在创建一个API,用于获取患者数据(id和名称),内科医生数据(id和名称)和约会(id,phyId,patId,app_date),并显示指定给特定医师的患者。我需要以一种方式在Doctor.js中创建一个远程方法,以使我获得具有phyId的相关约会并使用从约会获得的patId打印患者的详细信息。 我正在使用环回3。
请参阅此链接以获取清晰的主意:
https://loopback.io/doc/en/lb3/HasManyThrough-relations.html
在我的环回应用程序中,我有相关的模型(内科医生,患者),这些模型通过“ hasMany”彼此关联,并且通过“通过”约会(另一种模型)彼此关联,并且约会通过belongsTo与每个模型相关。特定医师的患者。
患者数据:
[
{
"id": 1,
"name": "Anna Mull"
},
{
"id": 2,
"name": "Paige Trner"
}
]
医师数据:
[
{
"id": 1,
"name": "Cardiologist"
}
]
约会数据:
[
{
"id": 1,
"physicianId": 1,
"patientId": 1,
"appointmentDate": "2019-01-28T10:06:33.530Z"
},
{
"id": 2,
"physicianId": 1,
"patientId": 2,
"appointmentDate": "2019-01-28T10:06:33.530Z"
}
]
我知道已经有一种方法可以查询医师的病人,但是我想自己编写代码以学习并以以下格式打印。 我的想法是获取所有具有特定phyId的约会,并在这些约会中找到patId并将其存储在数组中。然后,我使用该数组从“患者”模型中获取患者。我设法在一个函数中获取“患者”详细信息,但是我只能使用console.log(Patients),但无法在API响应中显示它。
以下是我需要的格式。(API响应中的预期输出)
Physician:
{
"id": 1,
"name": "Cardiologist"
}
Patients:
[
{
"id": 1,
"name": "Anna Mull"
},
{
"id": 2,
"name": "Paige Trner"
}
]
或任何类似格式。
我尝试过相同的操作,这是我的代码。
common / models / physician.js
'use strict';
var app = require('../../server/server');
module.exports = function (Physician) {
Physician.getDetails = function (phyid, cb) {
var Appointments = app.models.Appointment;
var Patient = app.models.Patient;
Physician.findById(phyid, function (err, Physician) {
Appointments.find({ where: { physicianId: phyid } }, function (err, Appointment) {
if (err) {
cb(null, "Errorrrrrrrr", "Errorrrrrr");
}
else {
var patients = [], i = 0;
var patobj= [];
for (i in Appointment) {
patients[i] = Appointment[i].patientId;
//console.log(patients);
Patient.findById(patients[i], function(err, Patients){
if(err){
cb("Error in patients", "--");
}
else{
patobj[i]=Patients;//doesnt have any effect
console.log(Patients);//prints in console
}
});
}
cb(null, Physician, patobj);//only Physician is printed, patobj is empty.
}
});
});
}
Physician.remoteMethod('getDetails', {
http: {
path:
'/:phyid/getDetails',
verb: 'get'
},
accepts: {
arg: 'phyid',
type: 'number'
},
returns: [{
arg: 'Physician',
type: 'Object'
}, {
arg: 'Patient',
type: 'Object'
}]
});
};
我实际上是在API响应中得到的:
{
"Physician": {
"id": 1,
"name": "Cardiologist"
},
"Patient": []
}
,并在控制台中显示:
D:\ Project \ Project1>节点。
Web服务器在以下位置监听:http://localhost:3000
通过http://localhost:3000/explorer浏览您的REST API
{名称:'Anna Mull',ID:1}
{名称:'Paige Trner',ID:2}
我应该如何在API响应中打印患者数据?
答案 0 :(得分:0)
您的患者为空,因为按ID查找患者是异步操作。但是for
循环是同步的。循环结束,并在找到任何患者之前调用下一行。
cb(null, Physician, patobj);//only Physician is printed, patobj is empty.
您需要等待使用Promise.all或async.each找到所有患者。