返回

Node.js gRPC 静态生成文件踩坑记录

前端

缘起

最近在开发一个 Node.js gRPC 服务,使用的是 grpc 库。在开发过程中遇到了一个奇怪的问题,记录如下。

问题

在使用 grpc.load() 方法加载 gRPC 服务定义文件(.proto 文件)时,遇到了以下错误:

Error: ENOENT: no such file or directory, open 'D:\grpc-project\node_modules\grpc-tools\lib\protoc'

这个错误的意思是,找不到 protoc 这个可执行文件。protoc 是一个编译 protobuf 文件的工具,是 gRPC 的一部分。在使用 gRPC 时,需要先使用 protoc.proto 文件编译成 .js 文件,然后才能使用 grpc.load() 方法加载这些 .js 文件。

排查过程

第一步:检查 protoc 是否安装

首先,我检查了一下 protoc 是否已经安装。在 Windows 系统上,可以通过以下命令检查 protoc 是否安装:

protoc --version

如果 protoc 已安装,则会输出 protoc 的版本号。

第二步:检查 grpc-tools 是否安装

grpc-tools 是一个 Node.js 库,它包含了 protoc 的 Node.js 版本。在使用 Node.js gRPC 时,需要先安装 grpc-tools。我检查了一下 grpc-tools 是否已经安装,发现并没有安装。于是我使用以下命令安装了 grpc-tools

npm install grpc-tools

第三步:检查 protoc 的路径

安装完 grpc-tools 后,我再次运行 protoc --version 命令,发现仍然找不到 protoc。这说明 protoc 的路径没有配置正确。

在 Windows 系统上,protoc 的路径一般位于 C:\Program Files\Google\Cloud SDK\protoc.exe。我检查了一下这个路径,发现确实存在 protoc.exe 文件。于是我将这个路径添加到环境变量 PATH 中。

第四步:再次尝试加载 gRPC 服务定义文件

在将 protoc 的路径添加到环境变量 PATH 中后,我再次尝试加载 gRPC 服务定义文件,发现还是会遇到同样的错误。

第五步:检查 protoc-gen-grpc 是否安装

protoc-gen-grpc 是一个插件,它可以将 .proto 文件编译成 .js 文件。在使用 Node.js gRPC 时,需要先安装 protoc-gen-grpc。我检查了一下 protoc-gen-grpc 是否已经安装,发现并没有安装。于是我使用以下命令安装了 protoc-gen-grpc

npm install protoc-gen-grpc

第六步:再次尝试加载 gRPC 服务定义文件

在安装完 protoc-gen-grpc 后,我再次尝试加载 gRPC 服务定义文件,发现终于成功了。

总结

这次排查过程让我学到了以下几点:

  • 在使用 Node.js gRPC 时,需要先安装 grpc-toolsprotoc-gen-grpc
  • 在 Windows 系统上,protoc 的路径一般位于 C:\Program Files\Google\Cloud SDK\protoc.exe
  • 在使用 grpc.load() 方法加载 gRPC 服务定义文件时,如果遇到 ENOENT: no such file or directory, open 'D:\grpc-project\node_modules\grpc-tools\lib\protoc' 错误,可以尝试检查一下 protocgrpc-toolsprotoc-gen-grpc 是否已经安装,以及 protoc 的路径是否配置正确。