Loopback - удаленный метод и выравнивание результата запроса связанной модели - PullRequest
0 голосов
/ 04 сентября 2018

Я занимаюсь разработкой приложения с использованием Loopback 3. Я создал удаленный метод в модели ServiceEvaluation, чтобы получить список ServiceEvaluations и связанных свойств в Service Model.

ServiceEvaluation.evaluationList = function(cb) {
    ServiceEvaluation.find({
        fields: {
            status: true,
            createdAt: true,
            serviceId: true
        },
        include: {
            relation: 'rel_ServiceEval_Service',
            scope: {
                fields: {
                    serviceName: true,
                    supplierId: true
                }
            }
        }
    }, function(err, response) {
        cb(null, response);
    });
};

Вышеуказанное работает при возврате из API Explorer, возвращающегося;

{
  "list": [
{
  "status": "Draft",
  "serviceId": "5b8e215d81c76325b409b960",
  "createdAt": "2018-09-04T06:08:29.623Z",
  "rel_ServiceEval_Service": {
    "serviceName": "Workplace software and SaaS",
    "id": "5b8e215d81c76325b409b960",
    "supplierId": "5b8e215d81c76325b409b949"
  }
}, ...

Однако вместо того, чтобы возвращать массив объектов со встроенными объектами, я хочу вернуть массив сплющенных объектов для отображения в сетке данных. Ниже приведена попытка сделать это.

ServiceEvaluation.evaluationList = function(cb) {
    ServiceEvaluation.find({
        fields: {
            status: true,
            createdAt: true,
            serviceId: true
        },
        include: {
            relation: 'rel_ServiceEval_Service',
            scope: {
                fields: {
                    serviceName: true,
                    supplierId: true
                }
            }
        }
    }, function(err, response) {
        var responseLength = response.length;
        var myEntry = {};
        var myList = [];
        for (var i = 0; i < responseLength; i++) {
            myEntry.status = response[i].status;
            myEntry.createdAt = response[i].createdAt;
            myEntry.serviceName = response[i].rel_ServiceEval_Service.serviceName;
            myEntry.supplierId = response[i].rel_ServiceEval_Service.supplierId;
            myList.push(myEntry);
        }
        cb(null, myList);
    });
};

Результатом этого является то, что удаленный метод, похоже, не находит поля в rel_ServiceEval_Service.

{
  "list": [
 {
  "status": "Draft",
  "createdAt": "2018-09-04T06:20:40.889Z"
}, ...

Я прибегнул к выравниванию возвращаемого значения в сервисе на стороне клиента, но это не только временное решение, пока в Dev. Любое руководство о том, как сделать это в удаленном методе?

1 Ответ

0 голосов
/ 04 сентября 2018

вам нужно использовать .toJSON () для сериализации возвращаемых данных:

ServiceEvaluation.evaluationList = function(cb) {
    ServiceEvaluation.find({
        fields: {
            status: true,
            createdAt: true,
            serviceId: true
        },
        include: {
            relation: 'rel_ServiceEval_Service',
            scope: {
                fields: {
                    serviceName: true,
                    supplierId: true
                }
            }
        }
    }, function(err, response) {
        var myEntry = {};
        var myList = [];
        async.map(response, function(singleItem,callback){
            serializedSingleItem = singleItem.toJSON()
            var myEntry = {status: serializedSingleItem.status, createdAt: serializedSingleItem.createdAt, serviceName: serializedSingleItem["rel_ServiceEval_Service"]["serviceName"], supplierId: serializedSingleItem["rel_ServiceEval_Service"]["supplierId"]}
            callback(null, myEntry)
        }, function(err, myList){
            cb(null, myList)
        })
    });
};
...