Как вызвать сервисы в цикле в узле экспресс? - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь вызвать службы в выражении узла в цикле.Но проблема в том, что перед вызовом всех служб выполняется оставшийся код.

Я пробовал некоторые варианты с Promise, async / await, но они не работали.По сути, мне нужно вызвать службу синхронно.

Я создал 2 фиктивных сервиса в заглушке JSON.В первом сервисном ответе я получу множество транспортных средств.Получив это, мне нужно обновить еще одно значение в каждом массиве, вызвав другую службу.

Здесь я столкнулся с проблемой, состоящей в том, что вторая служба не вызывается синхронно.

const express = require('express');
const request = require("request");
const router = express.Router();
router.get('/make', (req, res) => {
    var options = {
      headers: {
        'Content-Type': 'application/json',
        'JsonStub-User-Key': 'ddc159a0-5aa8-4a38-a0f1-913e4d768b56',
        'JsonStub-Project-Key': '34ba28a9-471c-435d-ab61-b7732c9583c6'
      },
        method: "GET",
        json: true,
        strictSSL : false,
        url: `http://jsonstub.com/vehicle/make`
      };
      request(options, function(error, response, body) {
        if (body){
          checkModelType(body);
          res.status(200).json(body).end();
        } else {
          console.log("REST Request timeout: ", JSON.stringify(error));
          res.status(400).json('Error').end();
        }
      });
});

function checkModelType(response){
  let vehicleList = response.vehicleList;
  console.log("--->"+vehicleList.length);
  for(var i = 0;i<vehicleList.length;++i){
   const modelType = findModel();
   vehicleList[i].modelType = modelType;
  }
  console.log("Updated Vehicle List:"+JSON.stringify(vehicleList));
}

const findModel = () =>{
  var options = {
    headers: {
      'Content-Type': 'application/json',
      'JsonStub-User-Key': 'ddc159a0-5aa8-4a38-a0f1-913e4d768b56',
      'JsonStub-Project-Key': '34ba28a9-471c-435d-ab61-b7732c9583c6'
    },
      method: "GET",
      json: true,
      strictSSL : false,
      url: `http://jsonstub.com/vehicle/details`
    };

    request(options, function(error, response, body) {
      if (body){
        console.log("Model Type-->"+body.output.modelType);
        return body.output.modelType;
      } else {
        console.log("REST Request timeout: ", JSON.stringify(error));
      }
    });
}

module.exports = router;


Response :
-----------

PS F:\workSpace_Node\TestApp> node app.js
server running at 9086
--->4
Updated Vehicle List:[{"make":"Audi","model":"A3","vin":"QVFCFQT7894563214"},{"make":"Audi","model":"A4","vin":"ASECFQT7894563214"},{"make":"Audi","model":"Q5","vin":"QWECFQT7894993214"}]
Model Type-->SD
Model Type-->SD
Model Type-->SD


Expected result :
[{"make":"Audi","model":"A3","modelType":"SD", "vin":"QVFCFQT7894563214"},{"make":"Audi","model":"A4","modelType":"SD","vin":"ASECFQT7894563214"}]

1 Ответ

0 голосов
/ 25 апреля 2019

Вы можете переключиться на библиотеку запроса-обещания вместо запроса, а затем выполнить асинхронное выполнение \ await:

const express = require('express');
const request = require('request-promise'); // switched library
const router = express.Router();
router.get('/make', async (req, res) => {
    var options = {
      headers: {
        'Content-Type': 'application/json',
        'JsonStub-User-Key': 'ddc159a0-5aa8-4a38-a0f1-913e4d768b56',
        'JsonStub-Project-Key': '34ba28a9-471c-435d-ab61-b7732c9583c6'
      },
        method: "GET",
        json: true,
        strictSSL : false,
        url: `http://jsonstub.com/vehicle/make`
      };
      const body = await request(options);
      if (body) {
        await checkModelType(body);
        res.status(200).json(body).end();
      } else {
        console.log("REST Request timeout: ", JSON.stringify(error));
        res.status(400).json('Error').end();
      }
});

async function checkModelType(response){
  let vehicleList = response.vehicleList;
  console.log("--->"+vehicleList.length);
  for(var i = 0;i<vehicleList.length;++i){
    const modelType = await findModel();
    vehicleList[i].modelType = modelType;
  }
  console.log("Updated Vehicle List:"+JSON.stringify(vehicleList));
}

const findModel = async () =>{
  var options = {
    headers: {
      'Content-Type': 'application/json',
      'JsonStub-User-Key': 'ddc159a0-5aa8-4a38-a0f1-913e4d768b56',
      'JsonStub-Project-Key': '34ba28a9-471c-435d-ab61-b7732c9583c6'
    },
      method: "GET",
      json: true,
      strictSSL : false,
      url: `http://jsonstub.com/vehicle/details`
    };

    const body = await request(options);
    if (body){
      console.log("Model Type-->"+body.output.modelType);
      return body.output.modelType;
    } else {
      console.log("REST Request timeout: ", JSON.stringify(error));
    }
}

module.exports = router;

И это изменит порядок операций:

--->4
Model Type-->SD
Model Type-->SD
Model Type-->SD
Model Type-->SD
Updated Vehicle List:[{"make":"Audi","model":"A3","vin":"QVFCFQT7894563214","modelType":"SD"},{"make":"Audi","model":"A4","vin":"ASECFQT7894563214","modelType":"SD"},{"make":"Audi","model":"Q7","modelType":"SD"},{"make":"Audi","model":"Q5","vin":"QWECFQT7894993214","modelType":"SD"}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...