I'm experienced with Grpc - having built iOS/ObjC front-end and C# backend 
over a two year period (a Grpc project consisting of a main proto with a 
service that has 27 methods, and about a dozen supporting protos for 
message definitions).

I am however, not super experienced with web development, so I am a little 
frustrated atm, trying to get simple things to work with Grpc-node.  I 
started with something simple - the HelloWorld example and modified it from 
there. 

Here is my current "test.proto":

syntax = "proto3";


package helloworld;


service Greeter {
    rpc SayHello(FooBarRequest) returns (FooBarReply);
    rpc SayHelp(FooBarRequest) returns (FooBarReply);
}


message FooBarRequest {
    string name = 1;
}
  
message FooBarReply {
    string message = 1;
}


server.js:

const _ = require('lodash');
const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');


const argv = require("minimist")(process.argv.slice(2));
console.dir(argv);


if (!argv.h) {
    console.log("Please start server.js with -h xx.xx.xx.xx:xxxx");
    process.exit(1);
}
console.log(`Starting server.js on : ${argv.h}`);


const PROTOS_PATH = __dirname + '/../protos/';
const BESERVICE_PROTO_PATH = PROTOS_PATH + 'test.proto';


const beDefinition = protoLoader.loadSync(
    BESERVICE_PROTO_PATH,
    {keepCase: true,
     longs: String,
     enums: String,
     defaults: true,
     oneofs: true
    });


const test = grpc.loadPackageDefinition(beDefinition).helloworld;


function SayHello(call, callback) {
    callback(null, {message: 'Hello ' + call.request.name});
}


function SayHelp(call, callback) {
    callback(null, {message: 'Help! ' + call.request.name});
}


function main() {
    var server = new grpc.Server();
    server.addService(test.Greeter.service, {
        SayHello: SayHello,
        SayHelp: SayHelp
    });
    server.bind(argv.h, grpc.ServerCredentials.createInsecure());
    server.start();
}
  
main();





client.js:

const grpc = require('grpc');
const util = require('util')
const protoLoader = require('@grpc/proto-loader');
const argv = require("minimist")(process.argv.slice(2));
console.dir(argv);


if (!argv.h) {
    console.log("Please start with -h xx.xx.xx.xx:xxxx");
    process.exit(1);
}
console.log(`Starting Node backend client on : ${argv.h}`);


const PROTOS_PATH = __dirname + '/../protos/';
const BESERVICE_PROTO_PATH = PROTOS_PATH + 'test.proto';


const beDefinition = protoLoader.loadSync(
    BESERVICE_PROTO_PATH,
    {keepCase: true,
     longs: String,
     enums: String,
     defaults: true,
     oneofs: true
    });


const test = grpc.loadPackageDefinition(beDefinition).helloworld;


function main() {
    var client = new test.Greeter(argv.h, grpc.credentials.createInsecure
());
    
    client.SayHello({ name: 'Darth' }, {}, (err, response) => {
        if (err) {
            console.error("error calling SayHello", err);
            return
        }
        console.log('Greeting:', response.message);


        client.SayHelp({ name: 'Darth' }, {}, (err, response) => {
            if (err) {
                console.error("error calling SayHelp", err);
                return
            }
            console.log('Help! ', response.message);
        });
    });
  }
  
  main();


I run the client and server on the same machine, using the same command 
line argument for the same host & port.

Can anyone explain why I get "RPC method not implemented" on the second 
method defined in the  Greeter service above?

wander@peniche:~/control-web/js$ !1186
node server.js -h 172.16.0.168:9090 &
[1] 57465
wander@peniche:~/control-web/js$ { _: [], h: '172.16.0.168:9090' }
Starting server.js on : 172.16.0.168:9090


wander@peniche:~/control-web/js$ !1187
node backendservice-node-client.js -h 172.16.0.168:9090
{ _: [], h: '172.16.0.168:9090' }
Starting Node backend client on : 172.16.0.168:9090
Greeting: Hello! Darth
error calling SayHelp { Error: 12 UNIMPLEMENTED: RPC method not implemented 
/helloworld.Greeter/SayHelp
    at Object.exports.createStatusError (/home/wander/control-web/
node_modules/grpc/src/common.js:91:15)
    at Object.onReceiveStatus (/home/wander/control-web/node_modules/grpc/
src/client_interceptors.js:1204:28)
    at InterceptingListener._callNext (/home/wander/control-web/node_modules
/grpc/src/client_interceptors.js:568:42)
    at InterceptingListener.onReceiveStatus (/home/wander/control-web/
node_modules/grpc/src/client_interceptors.js:618:8)
    at callback (/home/wander/control-web/node_modules/grpc/src/
client_interceptors.js:845:24)
  code: 12,
  metadata: Metadata { _internal_repr: {} },
  details: 'RPC method not implemented /helloworld.Greeter/SayHelp' }


If i remove the SayHelp method in the proto and update the client & server 
code, it works fine.

THANKS

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/grpc-io.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/3c7c48bc-3612-4c7e-9b30-9a30e47d1286%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to