Nodejs + Angular: проблема нескольких почтовых запросов Http - получение 2 HTTP-запросов на сервер при отправке только 1 - PullRequest
0 голосов
/ 30 марта 2020

Я новичок в выражении / nodejs и разрабатываю интерфейс angular, который выполняет вызовы API сторонним веб-сервисам через уровень интеграции NodeJS.

Интерфейс angular создает https отправить запрос на получение токена авторизации OAuth2, а затем использовать токен для доступа к защищенному ресурсу.

Реализация службы nodejs, представленная ниже, как-то работает, но у меня есть некоторые проблемы.

См. expressjs nodejs сервисный код ниже:

const express = require('express')
const https = require('https')
const app = express()
const  router  =  express.Router();
const cors = require('cors');
const bodyParser  = require("body-parser")
const api_helper = require('./util/api_helper')

const port = 3000

app.use(cors());
router.use(bodyParser.urlencoded({ extended:  true }));
router.use(bodyParser.json());


router.post('/register', (requestAccessTokenNg, responseAccessToken) => {
  console.log('Entering the registration endpoint ');

  var client_id = 'xxxx';
  var client_secret = 'yyyyy';
  var auth_header = 'Basic ' + Buffer.from(client_id + ':' + client_secret).toString('base64');
  const data = "grant_type=password&username=xxxx&password=yyyyy&client_id=uuuuu&client_secret=qqqqq";

  const test_user = JSON.stringify({
     "username": "joe",
     "password": "blogs"
  });

    let bodyAccessToken = '';
    let accessToken = '';

    const optionsAccessToken = {
      hostname: 'linux-111',
      port: 2323,
      path: '/xxx/auth/oauth2/token',
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-formurlencoded',
        'Content-Length': data.length
      }
    };

    const requestAccessToken = https.request(optionsAccessToken, (responseAccessToken) => {
    console.log(`statusCode: ${responseAccessToken.statusCode}`)

    responseAccessToken.on('data', (chunkAccessToken) => {
      //console.log(`ACCESS TOKEN : ${chunk}`);
      bodyAccessToken += chunkAccessToken.toString();
    });

    responseAccessToken.on('end', () => {
      console.log('No more data in response.');
      var jsonBody = JSON.parse(bodyAccessToken);
      accessToken = jsonBody.access_token;
      console.log('Access Token : '+jsonBody.access_token);

    ///////////////// Using authorisation token to access/persist protected resource //////////////////////////////////

    let bodyIdentityResponse = '';

    const optionsIdentity = {
            hostname: 'linux-111',
            port: 2323,
            path: '/user-endpoint/user',
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Content-Length': test_user.length,
                'Authorization': 'Bearer '+ accessToken
            }
        };

    const requestIdentity = https.request(optionsIdentity, (responseIdentity) => {
    console.log(`statusCode2: ${responseIdentity.statusCode}`)

    responseIdentity.on('data', (chunkIdentity) => {
       console.log(`USER  : ${chunkIdentity}`);
       bodyIdentityResponse += chunkIdentity.toString();
      });

    responseIdentity.on('end', () => {
       console.log('No more response data for responseIdentity.');
       var identityRecord = JSON.parse(bodyIdentityResponse);
       console.log('User Json Response : '+identityRecord);
      });
    });

    requestIdentity.write(test_user);
    requestIdentity.end();

    requestIdentity.on('error', (errorIdentity) => {
    console.log('error on creating identity is ' + errorIdentity);
   });

    //////////////////////End of Persisting Identity/////////////////////////////

    });
  });

  requestAccessToken.write(data);
  requestAccessToken.end();

  requestAccessToken.on('error', (errorAccessToken) => {
    console.log('error on getting access token ' + errorAccessToken);
  });

});

app.use(router);
app.listen(port, () => console.log(`Node server listening on port ${port}!`))

Мои проблемы:

  1. Я получаю 2 HTTP-запроса на сервер, когда отправляется только 1. Как предотвратить NodeJs повторный вызов первого http-запроса, который косвенно вызывает второй пост-запрос. Я думал, что вся суть responseAccessToken.on('end', () => в том, чтобы разрешить только одну транзакцию. Я подозреваю, что это эффект чанкинга / потоковой передачи данных ответа. К сожалению, это единственная конструкция, которую я нашел для обработки данных ответов. Прошу прощения за мое невежество в этом Nodejs шаблоне чанкинга / потоковой передачи.

FYI, интерфейс angular делает вызов Nodejs один раз; когда пользователь нажимает кнопку, но есть несколько повторных вызовов исходного почтового запроса на сервере nodeJS. Но все самопризывы работают.

Выглядит странно, но что вызывает эту повторную передачу, я не могу понять. Я прочитал, что способ работы response.on() состоит в том, чтобы разбить ответ на куски и обработать их кусками. Но в первом чанке ответа есть вся необходимая строка токена, так как мы можем остановить потоковую передачу после первого чанка?

Как объединить запросы, чтобы их стабильность и лучшие практики были согласованы в производственной среде? На данный момент я включил функцию второго пост-запроса в блоке responseAccessToken.on('end', () => {} первого пост-запроса, и это выглядит неправильно.

Любая помощь будет наиболее ценной с этими двумя вопросами. Подстройка кода также приветствуется. Спасибо друзья!

...