Ошибка gRPC-узла: неожиданный токен u в JSON в позиции 0

Поэтому я продолжаю получать эту ошибку «неожиданный токен u в JSON в позиции 0». В настоящее время я делаю запрос от основного инициатора, который делает запрос gRPC к серверу gRPC клиентов.

Когда я не помещаю файлы в контейнеры и не устанавливаю вручную пакеты npm в каждом каталоге, все работает без сбоев. Однако по какой-то причине, когда я помещаю свои файлы в контейнер, возникает эта проблема.

Обычно эта проблема возникает с асинхронными запросами (gRPC асинхронный, поэтому имеет смысл), и я думаю, что они стремятся к завершению, но никогда не могут этого сделать. Но dockerFile буквально делает то, что я делаю вручную (что работает ...)

Я просто в настоящее время не понимаю, почему это так.

Ошибка

Error:
undefined:1
undefined
^

SyntaxError: Unexpected token u in JSON at position 0
    at JSON.parse (<anonymous>)
    at horus.grabTrace (/usr/src/app/horus/horus.js:52:23)
    at ClientUnaryCall.<anonymous> (/usr/src/app/main.js:119:8)
    at ClientUnaryCall.emit (events.js:210:5)
    at Object.onReceiveMetadata (/usr/src/app/node_modules/grpc/src/client_interceptors.js:1202:15)
    at InterceptingListener._callNext (/usr/src/app/node_modules/grpc/src/client_interceptors.js:568:42)
    at InterceptingListener.onReceiveMetadata (/usr/src/app/node_modules/grpc/src/client_interceptors.js:582:8)
    at callback (/usr/src/app/node_modules/grpc/src/client_interceptors.js:845:24)

Структура файла

**3 Different Services**

**Books**
-stubs
  -booksStub
-BooksServer.js

**Customers**
-stubs (2 stubs for intraservice request)
  -booksStub
  -customersStub 
-customersServer.js
-Dockerfile

**Main**
-Main Initiator
-Dockerfile

Файлы Docker (все)

**Dockerfile (Customers Service)**
FROM node:12.14.0
WORKDIR /usr/src/app
COPY package*.json ./
COPY . /usr/src/app
RUN npm install
RUN npm install nodemon -g
EXPOSE 6000
CMD ["nodemon", "customersServer.js"]

**Dockerfile (Books Service)**
FROM node:12.14.0
WORKDIR /usr/src/app
COPY package*.json ./
COPY . /usr/src/app
RUN npm install
RUN npm install nodemon -g
EXPOSE 30043
CMD ["nodemon", "booksServer.js"]

**Dockerfile (Main Service)**
FROM node:12.14.0
WORKDIR /usr/src/app
COPY package*.json ./
COPY . /usr/src/app
RUN npm install
EXPOSE 4555
CMD ["node", "main.js"]

person TheRoadLessTaken    schedule 31.07.2020    source источник
comment
По-прежнему не могу решить эту проблему: /.   -  person TheRoadLessTaken    schedule 31.07.2020


Ответы (1)


Эта ошибка синтаксического анализа JSON является признаком основной проблемы, заключающейся в том, что некоторый фрагмент кода ожидает строку JSON и получает undefined. Информации в вопросе недостаточно, чтобы точно определить, почему это происходит, но трассировка стека имеет две записи между вызовом JSON.parse и событием из библиотеки gRPC:

    at JSON.parse (<anonymous>)
>   at horus.grabTrace (/usr/src/app/horus/horus.js:52:23)
>   at ClientUnaryCall.<anonymous> (/usr/src/app/main.js:119:8)
    at ClientUnaryCall.emit (events.js:210:5)

Это показывает, что в строке 52 horus.js вызывает JSON.parse, и ошибка указывает, что он передает undefined или "undefined" вместо строки JSON. Эта строка, в свою очередь, входит в функцию horus.grabTrace, которая вызывается из анонимного обработчика событий в строке 119 main.js. Таким образом, либо этот обработчик событий передает недопустимые данные в horus.grabTrace, либо передает допустимые данные, и horus.grabTrace обрабатывает их неправильно. Это, в свою очередь, может быть вызвано тем, что обработчик событий получил неожиданное значение.

Простой способ отладить это - добавить блок try...catch вокруг вызова horus.grabTrace в обработчике событий, и при возникновении ошибки выйти из системы, значение, переданное в обработчик событий, и значение, переданное в horus.grabTrace, а затем повторно выбросить ошибка остановки выполнения. Это скажет вам, какое значение ваш код обрабатывает неправильно, что должно помочь вам понять, что нужно изменить.

person murgatroid99    schedule 31.07.2020
comment
Да, ошибка точно там находится. Я нашел ошибку. Обычно мы отправляем метаданные с сервера клиенту. Эта логика работает, когда я не помещаю в контейнер все свои службы, но когда я его помещаю в контейнер, метаданные не определены ... Я считаю, что что-то с сетью Docker вызывает неопределенность метаданных. gRPC до сих пор был забавным временем: /. - person TheRoadLessTaken; 01.08.2020
comment
По какой-то причине, когда я докерирую службу книг, booksStub (клиент) не может связываться с сервером, и, следовательно, метаданные, которые должен получить сервер gRPC Books, не определены. - person TheRoadLessTaken; 01.08.2020
comment
Если клиент не может связаться с сервером, он должен получить пустой объект Metadata в событии metadata. Этот вопрос, кажется, указывает на то, что вы не справляетесь с этим правильно, и вам следует это исправить. Проблема подключения - это отдельный вопрос, и его следует рассматривать в отдельном вопросе. - person murgatroid99; 01.08.2020