平面缓冲区未定义
flatbuffers is not defined
我正在编写一个使用 google 平面缓冲区的 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;
架构文件名为 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
。
我调试了我的代码,我看到它在以下代码行中归档:
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
class,默认值 flatbuffers.Long.ZERO
会渗透到生成的文件中。
虽然这不是一个解决方案,但一种解决方法是手动将 flatbuffers 要求添加到生成的文件中;它很丑陋,但它可能比在更合适的答案(或修复)出现之前被阻止要好。
// In `drinks_generated.js`
var flatbuffers = require('../js/flatbuffers').flatbuffers;
注:
drinks.Drink.addDrinkFlavorId()
和 drinks.Drink.addGlobalImageId()
函数期望将 flatbuffers.Long
值传递给它们,因为它们在架构中被指定为 ulong
(fbs
文件)。因此,您需要确保您没有尝试传递简单的 number
类型。
例如:
var my_long = flatbuffers.Long(100, 0); // low = 100, high = 0
drinks.Drink.addDrinkFlavorId(builder, my_long);
因此,另一种可能的解决方法是更改模式中这些字段的数据类型以避免使用 ulong
,直到这里发生的事情变得更加清楚为止。
P.S。我很确定该片段第 30 行的 drinks.createDrinksVector
应该是 drinks.Drinks.createDrinksVector
.
我正在编写一个使用 google 平面缓冲区的 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;
架构文件名为 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
。
我调试了我的代码,我看到它在以下代码行中归档:
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
class,默认值 flatbuffers.Long.ZERO
会渗透到生成的文件中。
虽然这不是一个解决方案,但一种解决方法是手动将 flatbuffers 要求添加到生成的文件中;它很丑陋,但它可能比在更合适的答案(或修复)出现之前被阻止要好。
// In `drinks_generated.js`
var flatbuffers = require('../js/flatbuffers').flatbuffers;
注:
drinks.Drink.addDrinkFlavorId()
和 drinks.Drink.addGlobalImageId()
函数期望将 flatbuffers.Long
值传递给它们,因为它们在架构中被指定为 ulong
(fbs
文件)。因此,您需要确保您没有尝试传递简单的 number
类型。
例如:
var my_long = flatbuffers.Long(100, 0); // low = 100, high = 0
drinks.Drink.addDrinkFlavorId(builder, my_long);
因此,另一种可能的解决方法是更改模式中这些字段的数据类型以避免使用 ulong
,直到这里发生的事情变得更加清楚为止。
P.S。我很确定该片段第 30 行的 drinks.createDrinksVector
应该是 drinks.Drinks.createDrinksVector
.