Я использую apollo-boost: ^0.4.3
со следующим. js. Я недавно добавил аутентификацию cook ie на свой сайт. Самым большим изменением было добавление заголовков и конструктора credentials: 'include'
в ApolloClient
. Кроме того, в server.js
, который запускает express сервер для следующего. js Я добавил этот блок:
const getServer = (isDevHttps, expressApp) => {
if (isDevHttps) {
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
const httpsServerOptions = {
key: fs.readFileSync(path.resolve('cert', 'localhost.key')),
cert: fs.readFileSync(path.resolve('cert', 'localhost.crt'))
};
console.info('creating https server');
return createServer(httpsServerOptions, expressApp);
}
return expressApp;
};
, потому что мне нужно было работать в https при разработке. Все работало в разработке (я использовал https://localhost: 3000 для клиента и https://localhost: 443 для внутреннего сервера graphql). Однако, когда я sh отредактировал свой код на этапе, где nginx обслуживает stati c файлов и AWS хостов, экземпляр я начал получать эту ошибку:
ApolloError: Network error: request to https://beta.leafreport.com/graphql/ failed, reason: write EPROTO 140426009438016:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:../deps/openssl/openssl/ssl/record/rec_layer_s3.c:1536:SSL alert number 40
at new ApolloError (/src/node_modules/apollo-client/bundle.umd.js:92:26)
at /src/node_modules/apollo-client/bundle.umd.js:1588:34
at /src/node_modules/apollo-client/bundle.umd.js:2008:15
at Set.forEach (<anonymous>)
at /src/node_modules/apollo-client/bundle.umd.js:2006:26
at Map.forEach (<anonymous>)
at QueryManager.broadcastQueries (/src/node_modules/apollo-client/bundle.umd.js:2004:20)
at /src/node_modules/apollo-client/bundle.umd.js:1483:29
at runMicrotasks (<anonymous>)
at processTicksAndRejections (internal/process/task_queues.js:93:5) {
graphQLErrors: [],
networkError: FetchError: request to https://staging.mysite.com/graphql/ failed, reason: write EPROTO 140426009438016:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:../deps/openssl/openssl/ssl/record/rec_layer_s3.c:1536:SSL alert number 40
Первый раз, когда я нажал код isDevHttps
был true
по ошибке, а NODE_TLS_REJECT_UNAUTHORIZED
был установлен на 0. После этого я убедился, что isDevHttps
равен false
, и был повторно развернут. Используемый нами SSL-сертификат предоставляется AWS Cloudfront.
Это код инициализации для клиента Apollo:
import withApollo from 'next-with-apollo';
import ApolloClient, { InMemoryCache } from 'apollo-boost';
import { graphql_url } from 'my-config';
import { IntrospectionFragmentMatcher } from 'apollo-cache-inmemory';
import introspectionQueryResultData from '../../fragmentTypes.json';
const fragmentMatcher = new IntrospectionFragmentMatcher({
introspectionQueryResultData
});
function createClient({ ctx, headers, initialState }) {
return new ApolloClient({
credentials: 'include',
uri: graphql_url,
cache: new InMemoryCache({ fragmentMatcher }).restore(initialState || {}),
headers
});
}
export default withApollo(createClient, { getDataFromTree: 'ssr' });
Это мой пакет. json:
"dependencies": {
"@babel/runtime-corejs2": "^7.5.1",
"apollo-boost": "^0.4.3",
"apollo-mocked-provider": "^3.0.1",
"babel-eslint": "^10.0.2",
"body-parser": "^1.19.0",
"clean-css": "^4.2.1",
"compression": "^1.7.4",
"dotenv-load": "^2.0.0",
"graphql": "^14.3.1",
"graphql-tag": "^2.10.1",
"helmet": "^3.18.0",
"morgan": "^1.9.1",
"next": "^9.0.1",
"next-plugin-custom-babel-config": "^1.0.2",
"next-transpile-modules": "^2.3.1",
"next-with-apollo": "^4.2.0",
"nprogress": "^0.2.0",
"path": "^0.12.7",
"react-apollo": "^3.0.0",
"react-cookie-consent": "^2.5.0",
"react-google-login": "^3.2.1",
"react-facebook-login": "^4.0.1",
"react-minimal-pie-chart": "^4.2.0",
"react-motion-drawer": "^3.1.0",
"supports-webp": "^2.0.1",
"express-device": "^0.4.2"
}
Это dev.conf в nginx (это нормально, что ssl закомментирован, потому что сертификат поступает из облачного фронта):
server {
listen 80 default_server;
server_name staging.mysite.com;
include not_found.inc;
include static_resources.inc;
include ads.inc;
#include ssl.inc;
location / {
rewrite_log off;
include redirects/redirects.conf;
access_log /var/log/nginx/com-access.log combined;
error_log /var/log/nginx/com-error.log notice;
include graylog.logging;
include proxy_pass.inc;
auth_basic "closed site";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
На моем веб-сайте работает только домашняя страница, однако ни одна из них не работает другие страницы не со стороны сервера и возвращают ошибку рукопожатия сверху. Домашняя страница является обновленной версией Cloudfront. Некоторые страницы открываются при нажатии на ссылку на стороне клиента, но некоторые не открываются и приводят к внутренней ошибке 500 сервера (сбой рукопожатия) Поэтому серверная часть никогда не работает, но клиентская часть иногда работает.
Ничего из того, что я пробовал, до сих пор не работало, включая изменение AWS экземпляра, удаление заголовков / учетных данных из конструктора клиента apollo, повторное развертывание несколько раз.
Я вижу из стека ошибок, откуда происходит ошибка (node_modules / apollo-client / bundle.umd. js: 92: 26):
QueryManager.prototype.broadcastQueries = function () {
var _this = this;
this.onBroadcast();
this.queries.forEach(function (info, id) {
if (info.invalidated) {
info.listeners.forEach(function (listener) {
if (listener) {
listener(_this.queryStore.get(id), info.newData);
}
});
}
});
};
Почему клиент не сможет транслировать запросы?