Представление обновления стека MEAN с ответом Node/Express

У меня есть приложение панели мониторинга стека MEAN (server1), которое взаимодействует с сервером nodejs/express (server2), который отправляет запросы к mongoDB. Например, пользователь должен выбрать месяц в календаре приложения панели управления, и эта дата будет отправлена ​​на сервер nodejs/express, который запросит mongo и вернет, например, количество раз, которое вы посещали в тренажерном зале в течение этого месяца.

Я получаю правильный ответ, но у меня проблемы с обновлением представления (поскольку HTTP-запросы являются асинхронными, запрос в ответе выполняется быстрее и, таким образом, обновляет мое представление с неправильным значением)

Я решил свою просьбу следующим образом:

приложение для панели мониторинга – внешний интерфейс angular

$scope.query = function () {
        console.log("I am hereee");
        var month = ("0" + ($scope.dt.getMonth() + 1)).slice(-2);
        var date = $scope.dt.getFullYear() + "" + month;
        var queryData = JSON.stringify({MemberID_Hash: $scope.memberNo, Date_Key_Month: date});
        console.log("data: ", queryData);
        console.log("url: ", expressQuery);
        $http({ //send query to node/express server
            method: 'POST',
            url: expressQuery,
            data: queryData,
            withCredentials: true,
            headers: {
                    'Content-Type': 'application/json; charset=utf-8'
            }
        }).then(function(response) { //read backend response
            console.log (">>>>>>>>");
            $http({
            method : "POST",
            url : "http://localhost:9000/sendToController"
            }).then(function mySucces(response) {
              console.log("responde.data: ", response.data);
              $scope.nrOfSwipes = response.data;
            }, function myError(response) { });
        });
    };  

приложение для панели мониторинга — серверная часть в экспресс-версии

var dataController = "test"; // used a global variable to save the response value to update my view (bad design => thus, any help/suggestions would be greatly appreciated)

module.exports = function(app) {

    // receives the response from server2 - !! this is executed 2nd
    app.post('/getQueryJson', function(request, response) {
        if(response.statusCode == 200) { 

          console.log("In routes.js TESTING......")
          console.log("This is your request: ", request.body);

          dataController = request.body;
          console.log("dataController1: ", dataController);
          response.send(request.body);
        }else{
          response.send(" Error code: " + response.statusCode);
        }
    });

    // updates the view - !! this is executed first
    app.post('/sendToController', function(request, response) {
        console.log("dataController2: ", dataController);
        response.send(dataController);
    });
};

Проблема в том, что обработка запроса занимает больше времени, поэтому сначала выполняется мой ответ, вызывающий sendToController, а затем getQueryJson. Любая идея, как я могу изменить способ их выполнения? или любая идея, если это возможно, я могу отправить ответ от /getQueryJson непосредственно на внешний контроллер без необходимости делать другой запрос на /sendToController?

Я только начал знакомиться со стеком MEAN, поэтому понимаю, что это может звучать как простой вопрос, но я действительно застрял.


person KeykoYume    schedule 11.01.2017    source источник
comment
Вы всегда можете проверить свои маршруты с Почтальоном тоже.   -  person mrtaz    schedule 12.01.2017


Ответы (1)


Хотя вы связали обещания, порядок для вас отличается, потому что вы не возвращаете Promise. Редактирование кода для обеспечения порядка.

$http({
  method: 'POST',
  url: expressQuery,
  data: queryData,
  withCredentials: true,
  headers: {
    'Content-Type': 'application/json; charset=utf-8'
  }
}).then(() => {
  return $http({
    method: 'POST',  //read backend response
    url: 'http://localhost:9000/sendToController'
  });
}).then((response) => {
  console.log(`responde.data: ${response.data}`);
  $scope.nrOfSwipes = response.data;
}).catch((err) => {
  //if error occurs
  console.log('err', err.stack);
});

Изучив ваш код дальше, я вижу, что вызов sendToController не принимает никаких входных данных от getQueryJson. Если это реальный случай. Вы можете использовать Promise.all() для этого.

Внесение этих изменений в ваш код.

Promise.all([
  $http({
    method: 'POST',
    url: expressQuery,
    data: queryData,
    withCredentials: true,
    headers: {
      'Content-Type': 'application/json; charset=utf-8'
    }
  }),
  $http({
    method: 'POST',  //read backend response
    url: 'http://localhost:9000/sendToController'
  })
]).then((responses)=> {
  let ctrlResponse = responses[1];
  console.log(`responde.data: ${ctrlResponse.data}`);
  $scope.nrOfSwipes = ctrlResponse.data;
}).catch((err) => {
  console.log('err', err.stack);
});

или любая идея, если это возможно, я могу отправить ответ от /getQueryJson непосредственно на внешний контроллер без необходимости делать еще один запрос на /sendToController?

Да. Мы можем это сделать. Вам нужно ответить объектом в json. Но код, который вы нам предоставили, кажется заполнителем. Если можно их объединить. Это может выглядеть как

response.status(200).send({
    query: 'some string', // your getQueryJson response,
    controller: 'some more value' //sendToController
});
person Sridhar    schedule 12.01.2017