#node.js #protocol-buffers #grpc #rpc
Вопрос:
Я очень новичок в 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 gt; 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
Если я изменю значение крайнего срока на бесконечность, то это сработает. Но я хочу знать, почему функция простого квадратного корня не принимает крайний срок.
Ответ №1:
Это действительно помогает, что вы включили хорошую реплику!
Я думаю, ваша проблема в том, что крайние сроки-это моменты времени (а не продолжительность).
Таким образом, вы захотите рассчитать крайний срок с этого момента плюс некоторую продолжительность:
let d = new Date(); let deadline = d.setSeconds(d.getSeconds() 5); client.SquareRoot({ number: 1, }, { deadline: deadline, }, (err, response) =gt; { console.log(err, response); });
Примечания ваш код будет работать, но:
- у вас опечатка
SqaureRoot
и, напримерSquareRoot[Request|Response]
.SqaureRoot
(sic.) вычисляет квадрат, а не квадратный корень 😉- Возможно, вы захотите дать своему пакету и услуге более четкие имена, чтобы избежать
advanced.Advanced
server.start()
блокируется, и поэтому вы, возможно, захотите поставитьconsole.log("server starting")
его перед этим.