WARNING: RPC failed: Status{code=NOT_FOUND, description=Not found, cause=null} when trying to use GRPC in java and Nodejs

Gavin Smith :

I am currently trying to send a request to a nodejs server from a java client that I created but I am getting the error that is showing above. I've been doing some research on it but can seem to figure out why it is happening. The server I created in nodejs:

var grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader')
const packageDefinition = protoLoader.loadSync('AirConditioningDevice.proto')

var AirConditioningDeviceproto = grpc.loadPackageDefinition(packageDefinition);

var AirConditioningDevice = [{
    device_id: 1,
    name: 'Device1',
    location: 'room1',
    status: 'On',
    new_tempature: 11
}];

var server = new grpc.Server();
server.addService(AirConditioningDeviceproto.AirConditioningDevice.Airconditioning_service.service,{
    currentDetails: function(call, callback){
        console.log(call.request.device_id);
        for(var i =0; i <AirConditioningDevice.length; i++){
            console.log(call.request.device_id);
             if(AirConditioningDevice[i].device_id == call.request.device_id){
                console.log(call.request.device_id);
                 return callback(null, AirConditioningDevice [i]);
             }
             console.log(call.request.device_id);
        }
        console.log(call.request.device_id);
        callback({
            code: grpc.status.NOT_FOUND,
            details: 'Not found'
        });
    },
    setTemp: function(call, callback){
        for(var i =0; i <AirConditioningDevice.length; i++){
             if(AirConditioningDevice[i].device_id == call.request.device_id){

                 AirConditioningDevice[i].new_tempature == call.request.new_tempature;
                 return callback(null, AirConditioningDevice[i]);
             }
        }
        callback({
            code: grpc.status.NOT_FOUND,
            details: 'Not found'
        });

    },
    setOff: function(call, callback){
        for(var i =0; i <AirConditioningDevice.length; i++){
             if(AirConditioningDevice[i].device_id == call.request.device_id && AirConditioningDevice[i].status == 'on'){
                 AirConditioningDevice[i].status == 'off';
                 return callback(null, AirConditioningDevice[i]);
             }else{
                 AirConditioningDevice[i].status == 'on';
                 return callback(null, AirConditioningDevice[i]);
             }
        }
        callback({
            code: grpc.status.NOT_FOUND,
            details: 'Not found'
        });
    }
});

server.bind('localhost:3000', grpc.ServerCredentials.createInsecure());
server.start();

This is the client that I have created in java:

package com.air.grpc;

import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import com.air.grpc.Airconditioning_serviceGrpc;

import com.air.grpc.GrpcClient;
import com.air.grpc.deviceIDRequest;
import com.air.grpc.ACResponse;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.StatusRuntimeException;

public class GrpcClient {
    private static final Logger logger = Logger.getLogger(GrpcClient.class.getName());
    private final ManagedChannel channel;
    private final Airconditioning_serviceGrpc.Airconditioning_serviceBlockingStub blockingStub;
     private final Airconditioning_serviceGrpc.Airconditioning_serviceStub asyncStub;

     public GrpcClient(String host, int port) {
            this(ManagedChannelBuilder.forAddress(host, port)
                // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
                // needing certificates.
                .usePlaintext()
                .build());
          }
     GrpcClient(ManagedChannel channel) {
            this.channel = channel;
            blockingStub = Airconditioning_serviceGrpc.newBlockingStub(channel);
            asyncStub = Airconditioning_serviceGrpc.newStub(channel);
          }
     public void shutdown() throws InterruptedException {
            channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
          }

     public void currentDetails(int id) {
         logger.info("Will try to get device " + id + " ...");
         deviceIDRequest deviceid = deviceIDRequest.newBuilder().setDeviceId(id).build();
         ACResponse response;
         try {
             response =blockingStub.currentDetails(deviceid);

         }catch(StatusRuntimeException e) {
             logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
              return;
         }
          logger.info("Device: " + response.getAirConditioning ());

     }
     public static void main(String[] args) throws Exception {
         GrpcClient client = new GrpcClient("localhost", 3000);
         try {
             client.currentDetails(1);
         }finally {
            client.shutdown();
        }



          }




}

Right now the only one that I have tested cause its the most basic one is currentdetails. As you can see I have created an AirConditioningDevice object. I am trying to get the details of it by typing in 1 to a textbox which is the id but like i said when i send it i get the error in the title. This is the proto file that I have created:

syntax = "proto3";


package AirConditioningDevice;

option java_package = "AircondioningDevice.proto.ac";


service Airconditioning_service{
rpc currentDetails(deviceIDRequest) returns (ACResponse) {};
rpc setTemp( TempRequest ) returns (ACResponse) {};
rpc setOff(deviceIDRequest) returns (ACResponse) {};



}

message AirConditioning{
int32 device_id =1;
string name = 2;
string location = 3;
string status = 4;
int32 new_tempature = 5;
}

message deviceIDRequest{
int32 device_id =1;

}

message TempRequest {
    int32 device_id = 1;
    int32 new_temp = 2;
}

message ACResponse {
    AirConditioning airConditioning = 1;
}

lastly this is everything I get back in the console:

Apr 02, 2020 4:23:29 PM AircondioningDevice.proto.ac.AirConClient currentDetails
INFO: Will try to get device 1 ...
Apr 02, 2020 4:23:30 PM AircondioningDevice.proto.ac.AirConClient currentDetails
WARNING: RPC failed: Status{code=NOT_FOUND, description=Not found, cause=null}

I dont know whether I am completely off or if the error is small. Any suggestions? One other thing is I the same proto file in the java client and the node server I dont know if that matters. One last this is I also get this when i run my server: DeprecationWarning: grpc.load: Use the @grpc/proto-loader module with grpc.loadPackageDefinition instead I dont know if that has anything to do with it.

murgatroid99 :

In your .proto file, you declare deviceIDRequest with a field device_id, but you are checking call.request.id in the currentDetails handler. If you look at call.request.id directly, it's probably undefined.

You also aren't getting to this bit yet, but the success callback is using the books array instead of the AirConditioningDevice array.

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=393580&siteId=1