flatbuffers没有定义

我正在写一个使用谷歌扁平缓冲区的nodeJs应用程序。

我在我的MacBook Pro上安装了flatc,并编译了以下模式:

命名空间MyAlcoholist;

table Drink { drink_type_name: string; drink_company_name: string; drink_brand_name: string; drink_flavor_type_name : string; liquid_color_type_name : string; liquid_color_is_transparent : bool; alcohol_vol : float; calories_for_100g : uint; global_image_id: ulong; drink_flavor_id: ulong; } table Drinks { drinks:[Drink]; } root_type Drinks; 

schema文件名为drink.fbs,它生成了一个名为drink_generated.js的JavaScript文件

我将这个文件包含在我的nodejs应用程序中,并使用下面的代码将数据添加到它。这是我的flatBufferUtil.js实用程序文件。

 var flatbuffers = require('../js/flatbuffers').flatbuffers; var builder = new flatbuffers.Builder(); var drinks = require('../fbs/drinks_generated').MyAlcoholist; // Generated by `flatc`. function drinkArrayToBuffer(drinkArray) { var drinksVectArray = []; drinkArray.forEach(function (element, index, array) { var drinkObj = element; var drinkBrandName = builder.createString(drinkObj.drink_brand_name); var drinkCompanyName = builder.createString(drinkObj.drink_company_name); var drinkflavorTypeName = builder.createString(drinkObj.drink_flavor_type_name); var drinkTypeName = builder.createString(drinkObj.drink_type_name); var liquidColorTypeName = builder.createString(drinkObj.liquid_color_type_name); drinks.Drink.startDrink(builder); drinks.Drink.addAlcoholVol(builder, drinkObj.alcohol_vol); drinks.Drink.addCaloriesFor100g(builder,drinkObj.calories_for_100g); drinks.Drink.addDrinkBrandName(builder,drinkBrandName); drinks.Drink.addDrinkCompanyName(builder,drinkCompanyName); drinks.Drink.addDrinkFlavorId(builder,drinkObj.drink_flavor_id); drinks.Drink.addDrinkFlavorTypeName(builder, drinkflavorTypeName); drinks.Drink.addDrinkTypeName(builder,drinkTypeName); drinks.Drink.addGlobalImageId(builder,drinkObj.global_image_id); drinks.Drink.addLiquidColorIsTransparent(builder,drinkObj.is_transparent); drinks.Drink.addLiquidColorTypeName(builder,liquidColorTypeName); var drink = drinks.Drink.endDrink(builder); drinksVectArray.push(drink); }) var drinksVect = drinks.createDrinksVector(builder,drinksVectArray); builder.finish(drinksVect); var buf = builder.dataBuffer(); return buf; } module.exports.drinkArrayToBuffer=drinkArrayToBuffer; 

现在当我执行这个函数失败,错误flatbuffers is not defined

我debugging了我的代码,我看到它在下面的代码行上:

  drinks.Drink.addDrinkFlavorId(builder,drinkObj.drink_flavor_id); 

如果我得到里面addDrinkFlavorId函数,我在drinks_generted.js中看到这个代码:

 MyAlcoholist.Drink.addDrinkFlavorId = function(builder, drinkFlavorId) { builder.addFieldInt64(9, drinkFlavorId, flatbuffers.Long.ZERO); }; 

正如你可以看到它使用flatbuffers.Long.ZERO但flatbuffers没有在该文件中定义。 编译没有提供任何错误,所以我错过了什么?

在我看来,这是一个错误…生成的文件似乎意味着从flatbuffers要求自主存在。 但是对于自定义的flatbuffers.Long类, flatbuffers.Long的默认值会flatbuffers.Long.ZERO生成的文件中。

虽然这不是一个解决scheme,一个解决方法是手动添加flatbuffers需要生成的文件; 这是丑陋的,但它可能比被阻止,直到一个更合适的答案(或修复)来临时更好。

 // In `drinks_generated.js` var flatbuffers = require('../js/flatbuffers').flatbuffers; 

注意:

drinks.Drink.addDrinkFlavorId()drinks.Drink.addGlobalImageId()函数期望将flatbuffers.Long值传递给它们,因为它们在模式( fbs文件)中被指定为ulong 。 所以你需要确保你不想传入一个简单的numbertypes。

例如:

 var my_long = flatbuffers.Long(100, 0); // low = 100, high = 0 drinks.Drink.addDrinkFlavorId(builder, my_long); 

因此,另一个可能的解决方法是更改​​模式中这些字段的数据types,以避免使用ulong直到更清楚发生了什么为止。

PS我很确定drinks.createDrinksVector该线段30的片段应该是drinks.Drinks.createDrinksVector

Interesting Posts