开发RFID gRPC服务遇package name unexpected identifier错误求助
问题解决:gRPC服务启动报SyntaxError: Unexpected identifier
错误根源
你在server.js里直接用require('./rfid.proto')加载Protocol Buffers文件,Node.js只能解析JS/JSON格式的文件,完全不认识.proto的语法(比如package rfidgrpc;这类语句),所以抛出了标识符错误。
修复方案
- 删除直接加载
.proto文件的代码,改用grpc.loadPackageDefinition加载你已经通过protoLoader.loadSync解析好的包定义。 - 确保服务实现的方法名和proto文件中定义的rpc方法名对应:proto里的rpc是
ReadRFID,因为你开启了keepCase: true,对应的方法名应为readRFID。
修改后的server.js代码
const grpc = require('@grpc/grpc-js'); const protoLoader = require('@grpc/proto-loader'); const SerialPort = require('serialport').SerialPort; const {ReadlineParser} = require('@serialport/parser-readline'); var PROTO_PATH = `${__dirname}/rfid.proto`; const RFIDService = require('./RFIDService'); // Load the protobuf file var packageDefinition = protoLoader.loadSync( PROTO_PATH, {keepCase: true, longs: String, enums: String, defaults: true, oneofs: true }); // 正确加载gRPC包,替换之前错误的require('./rfid.proto') const rfidProto = grpc.loadPackageDefinition(packageDefinition).rfidgrpc; // Create the gRPC server function main() { var server = new grpc.Server(); // 方法名与proto中定义的rpc对应,keepCase:true下ReadRFID对应readRFID server.addService(rfidProto.RFIDService.service, { readRFID: RFIDService.prototype.readTag }); server.bindAsync("127.0.0.1:5000", grpc.ServerCredentials.createInsecure(), (err) => { if (err) { console.error("服务器启动失败:", err); return; } server.start(); console.log("GRPC Server 5000 üzerinde başlatıldı....."); }); } main();
额外注意事项
- 确认
RFIDService.js中的readTag方法符合gRPC方法签名:需接收call和callback两个参数,或者返回Promise。 - Node.js中使用gRPC的标准流程是:先通过
protoLoader解析.proto文件,再用grpc.loadPackageDefinition加载解析后的包定义,切勿直接加载.proto文件。
内容的提问来源于stack exchange,提问作者Nur Guzay
相关产品推荐
相关产品推荐

