我已经使用findById找到了Json数据,如何在代码中使用它?

时间:2019-01-28 11:06:06

标签: javascript node.js api loopback

我正在创建一个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响应中打印患者数据?

1 个答案:

答案 0 :(得分:0)

您的患者为空,因为按ID查找患者是异步操作。但是for循环是同步的。循环结束,并在找到任何患者之前调用下一行。

cb(null, Physician, patobj);//only Physician is printed, patobj is empty.

您需要等待使用Promise.allasync.each找到所有患者。