我试图使用@grpc/proto-loader来动态生成protobuf文件,以实现一个简单的服务器,但在Typescript中。
我已经
import { Server, loadPackageDefinition, ServerCredentials } from "grpc";
import { loadSync } from "@grpc/proto-loader";
const packageDefinition = loadSync(__dirname + "/protos/ArtifactUpload.proto");
const protoDescriptor = loadPackageDefinition(packageDefinition);
const impl = {
};
const server = new Server();
server.addService(protoDescriptor.ArtifactUpload, impl);
server.bind('0.0.0.0:50051', ServerCredentials.createInsecure());
server.start();
所以我有两个问题
1.在Javascript examples中,它们使用protoDescriptor.XXX.service
,但是在protoDescriptor.ArtifactUpload
中没有service
属性
1.如果我尝试在impl
中添加实现方法,编译器也无法编译。
由于JavaScript示例可以工作,我认为沿着add new property in Typescript object的问题可能能够添加必要的服务类型。然而,我到目前为止还没有运气。
我的Protobuf是
syntax = "proto3";
service ArtifactUpload {
rpc SignedUrlPutObject (UploadRequest) returns (SignedUrlPutObjectResponse) {}
}
message UploadRequest {
string message = 1;
}
message SignedUrlPutObjectResponse {
string reply = 1;
}
3条答案
按热度按时间cwxwcias1#
[2021年5月14日更新]:通过@grpc/proto-loader生成TypeScript现在发布了0.6.0版本!我已经更新了我的example here来反映这一点。您现在可以使用
npm i @grpc/proto-loader
安装最新版本的proto loader,它将包含TS生成脚本。下面的说明仍然有效。您可以使用原型加载器来生成类型。
首先,安装proto-loader:
然后,您可以像这样生成类型:
下面是我在这个例子中使用的proto文件:
一旦生成了类型,就可以像这样使用它们:
我在这里创建了如何使用gRPC和TypeScript的各种示例:https://github.com/badsyntax/grpc-js-typescript
7lrncoxx2#
最后我得到了它的工作如下:
在
package.json
中,我有以下内容:我使用
protobufjs
来构建一些类型,尽管它们大多未使用,因为它与GRPC不完全兼容。但是,它确实保存了请求和响应类型的时间。我仍然需要创建服务器类型并将其应用于
protoDescriptor
。在此重复强调。我使用
any
作为service
,因为它是唯一一个允许我避免放入任何特定于IArtifactUpload的东西的东西。应该尝试提供一个表示服务器的对象。
我将我的解决方案链接到https://github.com/protobufjs/protobuf.js/issues/1017#issuecomment-725064230,以防我错过了更好的方法。
q3aa05253#
永远不要使用@grpc/proto-loader,它使用的是
eval
。它是不安全