Tengo un mensaje protobuf en service.proto
message DataUpdate { uint32 source = 1; uint32 destination = 2; } message DataUpdateRequest { string filepath = 1; repeated DataUpdate updates = 2; } y usé protoc para obtener el archivo js para el archivo protobuf anterior y asigné los valores de la siguiente manera en el archivo mecanografiado
function exec() { const servicePb = require('service_pb'); const req = new servicePb.DataUpdateRequest(); req.setFilepath('C:/Users/santhosh/test.txt'); req.setUpdatesList([{ source: 1, destination: 2, }]); // <- this line is throwing an error // sending req.serializeBinary() as data to endpoint }El error en setUpdatesList es:
TypeError: c[e].toArray is not a function at Function.push.../../node_modules/google-protobuf/google-protobuf.js.jspb.Message.setRepeatedWrapperField (google-protobuf.js:511:1)¿Cómo debo asignar valor a este tipo de mensaje?
Lo intenté con el cartero con el siguiente cuerpo json (y Content-Type: application/json) y funcionó
{ "filepath": "C:/Users/santhosh/test.txt", "updates": [ { "destination": 2, "source": 1 } ] }¿Cómo debo asignar valor a la lista de actualizaciones de campo repetidas en mecanografiado?
Descubrí la solución. Necesitamos usar el setter de DataUpdate. Así que algo como seguir funcionaría.
function exec() { const servicePb = require('service_pb'); const req = new servicePb.DataUpdateRequest(); req.setFilepath('C:/Users/santhosh/test.txt'); // here is the change we need to make const dataUpdate = new servicePb.DataUpdate(); dataUpdate.setSource(1); dataUpdate.setDestination(2); req.setUpdatesList([dataUpdate]); // or req.addUpdates(dataUpdate) will also work // sending req.serializeBinary() as data to endpoint }