There is a helpful reply to this same question on the gRPC Google Group:
https://groups.google.com/d/msg/grpc-io/X_bUx3T8S7s/x38FU429CgAJ
You can send a custom status message to the client using the Error
object's message property. In your example, that is "MY_ERROR". The
status code should be in the "code" property, just like how you see it
on the client side.
If you want to use the gRPC status structure instead of a JavaScript
error, you can do so by populating the "code" property and the
"message" or "details" property of the object.
If you want to send metadata, you should construct an instance of the
grpc.Metadata class, then add key/value pairs to the resulting object.
Then you can pass it as the third argument of the callback or set the
error's "metadata" property to send it to the client with the error.
Please note that the status codes that gRPC uses are not HTTP status
codes, but gRPC specific codes that are defined in grpc.status. You
should only set the error's code property using those codes. If you
want to send your own codes, use metadata instead.
I'll illustrate what's written above with some examples.
To send a custom message with the error, construct an Error
with the message. This sets the message
property:
var jsErr = new Error('Unauthorized');
As mentioned above, it's probably not useful to directly set gRPC status codes in your case. But, for reference, the gRPC status code can be set through the error's code
property:
jsErr.code = grpc.status.PERMISSION_DENIED;
To send your own error codes, or other information, use metadata:
var metadata = new grpc.Metadata();
metadata.set('key1', 'value2');
metadata.set('key2', 'value2');
jsErr.metadata = metadata;
Now, if the server constructs the error as above and the client outputs the returned error with:
console.log(Object.getOwnPropertyNames(err));
console.log(err);
console.log(err.metadata);
then the client output is:
[ 'stack', 'message', 'code', 'metadata' ]
{ [Error: Unauthorized]
code: 7,
metadata: Metadata { _internal_repr: { key1: [Object], key2: [Object] } } }
Metadata { _internal_repr: { key1: [ 'value2' ], key2: [ 'value2' ] } }