Я построил два образа докера. Один с nginx, который обслуживает мое угловое веб-приложение, а другой с node.js, который служит базовым экспресс-приложением. Я пытался получить доступ к приложению Express из моего браузера одновременно на двух разных вкладках.
В одной вкладке сервер угловой разработки (ng serve) обслуживает веб-страницу. На другой вкладке контейнер Docker Nginx обслуживает веб-страницу.
При одновременном доступе к приложению node.js express с обеих вкладок данные начинают смешиваться и смешиваться, а результаты, возвращаемые на обе вкладки, представляют собой смесь двух запросов (по одному на каждой вкладке браузера) ...
Я постараюсь сделать это проще, показав мой экспресс-код приложения здесь ... но чтобы ответить на этот вопрос, вам может даже не понадобиться вообще знать, что это за код ... так что, возможно, проверьте вопрос, как указано сначала под кодом.
'use strict';
/***********************************
GOOGLE GMAIL AND OAUTH SETUP
***********************************/
const fs = require('fs');
const {google} = require('googleapis');
const gmail = google.gmail('v1');
const clientSecretJson = JSON.parse(fs.readFileSync('./client_secret.json'));
const oauth2Client = new google.auth.OAuth2(
clientSecretJson.web.client_id,
clientSecretJson.web.client_secret,
'https://us-central1-labelorganizer.cloudfunctions.net/oauth2callback'
);
/***********************************
EXPRESS WITH CORS SETUP
***********************************/
const PORT = 8000;
const HOST = '0.0.0.0';
const express = require('express');
const cors = require('cors');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const whiteList = [
'http://localhost:4200',
'http://localhost:80',
'http://localhost',
];
const googleApi = express();
googleApi.use(
cors({
origin: whiteList
}),
cookieParser(),
bodyParser()
);
function getPageOfThreads(pageToken, userId, labelIds) {
return new Promise((resolve, reject) => {
gmail.users.threads.list(
{
'auth': oauth2Client,
'userId': userId,
'labelIds': labelIds,
'pageToken': pageToken
},
(error, response) => {
if (error) {
console.error(error);
reject(error);
}
resolve(response.data);
}
)
});
}
async function getPages(nextPageToken, userId, labelIds, result) {
while (nextPageToken) {
let pageOfThreads = await getPageOfThreads(nextPageToken, userId, labelIds);
console.log(pageOfThreads.nextPageToken);
pageOfThreads.threads.forEach((thread) => {
result = result.concat(thread.id);
})
nextPageToken = pageOfThreads.nextPageToken;
}
return result;
}
googleApi.post('/threads', (req, res) => {
console.log(req.body);
let threadIds = [];
oauth2Client.credentials = req.body.token;
let getAllThreadIds = new Promise((resolve, reject) => {
gmail.users.threads.list(
{ 'auth': oauth2Client, 'userId': 'me', 'maxResults': 500 },
(err, response) => {
if (err) {
console.error(err)
reject(err);
}
if (response.data.threads) {
response.data.threads.forEach((thread) => {
threadIds = threadIds.concat(thread.id);
});
}
if (response.data.nextPageToken) {
getPages(response.data.nextPageToken, 'me', ['INBOX'], threadIds).then(result => {
resolve(result);
}).catch((err) => {
console.error(err);
reject(err);
});
} else {
resolve(threadIds);
}
}
);
});
getAllThreadIds
.then((result) => {
res.send({ threadIds: result });
})
.catch((error) => {
res.status(500).send({ error: 'Request failed with error: ' + error })
});
});
googleApi.get('/', (req, res) => res.send('Hello World!'))
googleApi.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);
Приложение angular делает простой запрос к приложению express и ожидает ответа ... который он правильно получает ... но когда я пытаюсь сделать два запроса в одно и то же время, данные начинают смешиваться и результаты возвращаются на каждую вкладку браузера из разных аккаунтов ...
... и вопрос ... При запуске контейнеров в облаке возникает такая проблема? Нужно ли раскручивать новый контейнер для каждого клиента, который хочет активно подключаться к экспресс-службе, чтобы их данные не смешивались?
... или это проблема, с которой я сталкиваюсь, потому что к экспресс-приложению обращаются из моего компьютера? Если две машины с двумя разными IP-адресами будут пытаться получить доступ к этому экспресс-серверу одновременно, будет ли проблема такого рода смешивания данных по-прежнему проблемой или каждая из них получит свой собственный набор результатов?
Вот почему люди используют CaaS вместо решений IaaS?
К вашему сведению: это демонстрационный код, и данные на самом деле не будут возвращаться непосредственно к потребителю ... планируется поместить его в базу данных, а затем повторно извлечь из базы данных, чтобы загрузить все заголовки метаданных для каждое электронное письмо.
-Спасибо за ваше время