You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发RFID gRPC服务遇package name unexpected identifier错误求助

问题解决:gRPC服务启动报SyntaxError: Unexpected identifier

错误根源

你在server.js里直接用require('./rfid.proto')加载Protocol Buffers文件,Node.js只能解析JS/JSON格式的文件,完全不认识.proto的语法(比如package rfidgrpc;这类语句),所以抛出了标识符错误。

修复方案

  1. 删除直接加载.proto文件的代码,改用grpc.loadPackageDefinition加载你已经通过protoLoader.loadSync解析好的包定义。
  2. 确保服务实现的方法名和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:25:24