Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未定义扁平缓冲区_Javascript_Node.js_Flatbuffers - Fatal编程技术网

Javascript 未定义扁平缓冲区

Javascript 未定义扁平缓冲区,javascript,node.js,flatbuffers,Javascript,Node.js,Flatbuffers,我正在编写一个使用GoogleFlatBuffer的nodeJs应用程序 我在macbook pro上安装了flatc,并编译了以下模式: 酗酒者 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_colo

我正在编写一个使用GoogleFlatBuffer的nodeJs应用程序

我在macbook pro上安装了flatc,并编译了以下模式:

酗酒者

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;
模式文件名为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

我调试了我的代码,我看到它在以下代码行中归档:

    drinks.Drink.addDrinkFlavorId(builder,drinkObj.drink_flavor_id);
如果我进入addDrinkFlavorId函数,我会在drinks_gented.js中看到以下代码:

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

如您所见,它使用
flatbuffers.Long.ZERO
,但该文件中根本没有定义flatbuffers。编译没有提供任何错误,所以我错过了什么?

在我看来,这似乎是一个bug。。。生成的文件似乎要从
flatbuffers
require独立存在。但是,对于自定义的
flatbuffers.Long
类,默认的
flatbuffers.Long.ZERO
会进入生成的文件

虽然这不是一个解决方案,但一个解决方法是手动将所需的flatbuffers添加到生成的文件中;这很难看,但可能比在得到更合适的答案(或修复)之前被阻止要好

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

drinks.Drink.addDrinkFlavorId()
drinks.Drink.addGlobalImageId()
函数需要将
flatbuffer.Long
值传递给它们,因为它们在架构(
fbs
文件)中被指定为
ulong
。因此,您需要确保您没有试图传入简单的
number
类型

例如:

var my_long = flatbuffers.Long(100, 0); // low = 100, high = 0
drinks.Drink.addDrinkFlavorId(builder, my_long);
因此,另一种可能的解决方法是更改模式中这些字段的数据类型,以避免使用
ulong
,直到这里发生的事情变得更加清楚


另外,我非常确定该代码片段第30行的
drinks.createDrinksVector
应该是
drinks.drinks.createDrinksVector

我代表您提交了一份错误报告。希望这将得到更明确的解决。为了让您随时了解最新情况,此问题已在以下日期修复: