1

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が、フラットバッファはそのファイルでまったく定義されていません。コンパイルでエラーが発生しなかったので、何が欠けていますか?

4

1 に答える 1

1

バグのように思えます...生成されたファイルは、flatbuffersrequireから自律的に存在することを意図しているようです。ただし、カスタムflatbuffers.Longクラスの場合、デフォルトのflatbuffers.Long.ZEROが生成されたファイルにブリードします。

これは一概に解決策ではありませんが、回避策の 1 つは、必要なフラットバッファを生成されたファイルに手動で追加することです。見苦しいですが、より適切な回答 (または修正) が得られるまでブロックされるよりはましかもしれません。

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

ノート:

drinks.Drink.addDrinkFlavorId()および関数は、スキーマ (ファイル)で指定されているため、値が渡されることをdrinks.Drink.addGlobalImageId()想定しています。したがって、単純な型を渡そうとしないようにする必要があります。flatbuffers.Longulongfbsnumber

例えば:

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

結果として、別の可能な回避策は、スキーマ内のこれらのフィールドのデータ型を変更してulong、ここで何が起こっているのかがより明確になるまで使用しないようにすることです。

PSdrinks.createDrinksVectorそのスニペットの 30 行目はdrinks.Drinks.createDrinksVector.

于 2016-02-19T08:55:18.903 に答える