Я новичок в выражении / 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}!`))
Мои проблемы:
- Я получаю 2 HTTP-запроса на сервер, когда отправляется только 1. Как предотвратить NodeJs повторный вызов первого http-запроса, который косвенно вызывает второй пост-запрос. Я думал, что вся суть
responseAccessToken.on('end', () =>
в том, чтобы разрешить только одну транзакцию. Я подозреваю, что это эффект чанкинга / потоковой передачи данных ответа. К сожалению, это единственная конструкция, которую я нашел для обработки данных ответов. Прошу прощения за мое невежество в этом Nodejs шаблоне чанкинга / потоковой передачи.
FYI, интерфейс angular делает вызов Nodejs один раз; когда пользователь нажимает кнопку, но есть несколько повторных вызовов исходного почтового запроса на сервере nodeJS. Но все самопризывы работают.
Выглядит странно, но что вызывает эту повторную передачу, я не могу понять. Я прочитал, что способ работы response.on()
состоит в том, чтобы разбить ответ на куски и обработать их кусками. Но в первом чанке ответа есть вся необходимая строка токена, так как мы можем остановить потоковую передачу после первого чанка?
Как объединить запросы, чтобы их стабильность и лучшие практики были согласованы в производственной среде? На данный момент я включил функцию второго пост-запроса в блоке
responseAccessToken.on('end', () => {}
первого пост-запроса, и это выглядит неправильно.
Любая помощь будет наиболее ценной с этими двумя вопросами. Подстройка кода также приветствуется. Спасибо друзья!