我是一个非常新的gRPC,我已经尝试将截止日期值从1000增加到10000000000
代码如下:
client.js
const path = require('path');
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
const packageDefinitition = protoLoader.loadSync(
path.join(__dirname, '../protos/advanced.proto'),
{
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
}
);
const advancedProto = grpc.loadPackageDefinition(packageDefinitition).advanced;
function main() {
const client = new advancedProto.Advanced(
'localhost:50051',
grpc.credentials.createInsecure()
);
client.SqaureRoot({ number: 1 }, { deadline: 10000000000 }, function (err, response) {
console.log(err, response);
});
}
main();
server.js
const path = require('path');
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
const packageDefinitition = protoLoader.loadSync(
path.join(__dirname, '../protos/advanced.proto'),
{
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
}
);
const advancedProto = grpc.loadPackageDefinition(packageDefinitition).advanced;
function SqaureRoot(call, callback) {
if (call.request.number > 0) {
return callback(null, { result: call.request.number * call.request.number });
}
return callback({
code: grpc.status.INVALID_ARGUMENT,
message: "The number is not greater than 0"
})
}
function main() {
const Server = new grpc.Server();
Server.addService(advancedProto.Advanced.service, { SqaureRoot });
Server.bindAsync("127.0.0.1:50051", grpc.ServerCredentials.createInsecure(), function() {
Server.start();
console.log(`Server running at 127.0.0.1:50051`);
});
}
main();
proto_file
syntax = "proto3";
package advanced;
service Advanced {
// error handling
rpc SqaureRoot (SquareRootRequest) returns (SquareRootResponse) {};
}
message SquareRootRequest {
int32 number = 1;
}
message SquareRootResponse {
double result = 1;
}
当我从客户端执行代码时,我得到这个错误,无论截止日期值是
node client
Error: 4 DEADLINE_EXCEEDED: Deadline exceeded
at Object.callErrorFromStatus (/Users/Desktop/own/grpc-workspace/advanced/node_modules/@grpc/grpc-js/build/src/call.js:31:26)
at Object.onReceiveStatus (/Users/Desktop/own/grpc-workspace/advanced/node_modules/@grpc/grpc-js/build/src/client.js:180:52)
at Object.onReceiveStatus (/Users/Desktop/own/grpc-workspace/advanced/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:336:141)
at Object.onReceiveStatus (/Users/Desktop/own/grpc-workspace/advanced/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:299:181)
at /Users/Desktop/own/grpc-workspace/advanced/node_modules/@grpc/grpc-js/build/src/call-stream.js:160:78
at processTicksAndRejections (internal/process/task_queues.js:79:11) {
code: 4,
details: 'Deadline exceeded',
metadata: Metadata { internalRepr: Map {}, options: {} }
} undefined
如果我将截止日期值更改为无穷大,则它可以工作。但是我想知道为什么平方根函数不接受截止日期。
这真的很有帮助,你包括一个良好的再现!
我认为你的问题是最后期限是时间点(而不是持续时间)。
所以你要计算截止日期从现在开始加上一些持续时间:
let d = new Date();
let deadline = d.setSeconds(d.getSeconds() + 5);
client.SquareRoot({
number: 1,
}, {
deadline: deadline,
}, (err, response) => {
console.log(err, response);
});
指出你的代码可以工作,但是:
- 你有一个错字
SqaureRoot
和例如SquareRoot[Request|Response]
。SqaureRoot
(sic.)计算平方根而不是平方根;-)- 你可能想给你的包和服务更明显的名称,以避免
advanced.Advanced
server.start()
阻塞,所以你可能想把console.log("server starting")
放在它前面。