【发布时间】:2021-01-08 15:00:29
【问题描述】:
我有一个使用NestJs+gRPC的服务器,我在PostgreSQL中存储数据,获取数据没有问题等等。我无法发送 grpcurl 请求 :((
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.connectMicroservice<MicroserviceOptions>(grpcClientOptions);
await app.startAllMicroservicesAsync();
await app.listen(3000);
console.log(`Application is running on: ${await app.getUrl()}`);
}
(async () => await bootstrap())();
export const grpcClientOptions: ClientOptions = {
transport: Transport.GRPC,
options: {
url: '0.0.0.0:5000',
package: 'user',
protoPath: join(__dirname,'user/user.proto'),
loader: {
keepCase: true,
longs: Number,
defaults: false,
arrays: true,
objects: true,
},
},
};
原型文件看起来像
syntax = "proto3";
package user;
service UserService {
rpc FindOne (UserById) returns (User) {}
}
message UserById {
string id = 1;
}
message User {
int32 id = 1;
string name = 2;
string password = 3;
string email = 4;
string createdAt = 5;
string updatedAt = 6;
}
和用户控制器
@Get(':id')
getById(@Param('id') id: string): Observable<User> {
console.log(id);
return this.userService.findOne({ id : +id });
}
@GrpcMethod('UserService','FindOne')
async findOne(data: UserById): Promise<User> {
const { id } = data;
console.log(id);
return this.userModel.findOne({
where: {
id : id
},
});
}
当我从浏览器发送请求时它可以正常工作,但我无法使用 grpcurl。 enter image description here
谢谢转发!
【问题讨论】:
-
请将文本复制粘贴到问题中,而不是包含图像。这些命令看起来格式正确,对我来说,在 Linux shell 中,我得到(如预期的那样)连接被拒绝(因为我在 localhost:5000 上没有服务器)。我怀疑(!)问题是您在 Windows 上,但在
src/user之间使用正斜杠,而在 Windows 上(!?)文件路径分隔符应该是反斜杠? -
URL
0.0.0.0:5000看起来不适合客户。如果您改用localhost:5000会怎样? -
@DazWilkin 非常感谢!!!!现在我可以发送请求,但现在我遇到了另一个问题:我无法传递我的 id:1 参数。在终端我有 grpcurl -d "{"id":1}" -plaintext -import-path src\user -proto user.proto localhost:5000 user.UserService.FindOne 调用方法“user.UserService.FindOne”时出错:错误获取请求数据:无效字符“i”正在寻找对象键字符串的开头。你可以帮忙吗?我正在使用 Windows
-
不客气!很高兴它奏效了。请尝试
-d "{\"id\":1}" -
@DazWilkin grpcurl -d '{\"id\":1}' -plaintext -import-path src\user -proto user.proto localhost:5000 user.UserService.FindOne 错误调用方法“ user.UserService.FindOne":获取请求数据时出错:无效字符 '\'' 正在寻找值的开头。它不起作用,但还是谢谢你))