【问题标题】:gRPC-Node Error: Unexpected token u in JSON at position 0gRPC-Node 错误:位置 0 处 JSON 中的意外令牌 u
【发布时间】:2020-11-20 20:59:55
【问题描述】:

所以我不断收到这个“位置 0 的 JSON 中的意外令牌 u”错误。我目前正在从向客户 gRPC 服务器发出 gRPC 请求的主发起者发出请求。

当我不将文件容器化并在每个目录中手动 npm install 包时,它可以顺利运行。但是,由于某种原因,当我将文件容器化时,它出现了这个问题。

这个问题通常发生在异步请求中(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"]

【问题讨论】:

  • 仍然无法解决这个问题:/。

标签: docker docker-compose dockerfile grpc grpc-node


【解决方案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 函数中,该函数被main.js 的第119 行的匿名事件处理程序调用。所以,要么这个事件处理程序将无效数据传递给horus.grabTrace,要么它传递了有效数据而horus.grabTrace 处理不正确。这又可能是由事件处理程序接收到意外值引起的。

一种简单的调试方法是在事件处理程序中对horus.grabTrace 的调用周围添加一个try...catch 块,当出现错误时注销传递给事件处理程序的值,并将值传递给horus.grabTrace,然后重新抛出错误停止执行。这将告诉您您的代码未正确处理哪个值,这将有助于您了解要更改的内容。

【讨论】:

  • 是的,错误肯定在那儿。我发现了错误。基本上,我们将元数据从服务器发送回客户端。当我不将所有服务容器化时,此逻辑有效,但是当我将其容器化时,元数据未定义......我相信 Docker 网络的某些东西导致元数据未定义。到目前为止,gRPC 一直是一个有趣的时间:/.
  • 由于某种原因,当我对图书服务进行 docker 化时,booksStub(客户端)无法与服务器通信,因此 gRPC 图书服务器应该接收的元数据未定义。
  • 如果客户端无法与服务器通信,它应该在metadata 事件中获得一个空的Metadata 对象。这个问题似乎表明您没有正确处理该问题,您应该修复它。连接问题是一个单独的问题,应在单独的问题中处理。
猜你喜欢
  • 2021-12-21
  • 1970-01-01
  • 2020-04-23
  • 2022-07-11
  • 1970-01-01
  • 2019-04-12
  • 2018-01-29
  • 1970-01-01
  • 2021-07-01
相关资源
最近更新 更多