Почему я получаю рукопожатие, ошибка клиента Apollo (с ошибкой EPROTO)? - PullRequest
0 голосов
/ 29 января 2020

Я использую 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);
        }
      });
    }
  });
};

Почему клиент не сможет транслировать запросы?

...