ホームページ ウェブフロントエンド jsチュートリアル C/Cを使用してNode.jsモジュールを実装する(2)_node.js

C/Cを使用してNode.jsモジュールを実装する(2)_node.js

May 16, 2016 pm 04:35 PM
c node.js モジュール

過去を振り返り、新しいことを学ぶと幸せになれます

まず最初に、この V8 オンライン マニュアル (http://izs.me/v8-docs/main.html) を思い出してください。

前回のbuilding.gypファイルをまだ覚えていますか?

コードをコピー コードは次のとおりです:

{
"ターゲット": [
{
"target_name": "アドオン",
"ソース": [ "addon.cc" ]
}
]
}

これと同じように、*.cc ファイルがさらにいくつかある場合は、次のようになります:
"ソース": [ "addon.cc", "myexample.cc" ]

前回は 2 つのステップに分けましたが、実際には、構成とコンパイルは次のようにまとめることができます。 $node-gypconfigurebuild

レビューはもう終わりましたか?それなし? !

はい、続けましょう。

目次

関数パラメータ

いよいよパラメータについて話さなければなりません。

a と b を加算して結果を返す関数 add(a, b) があると仮定して、最初に関数の概要を記述します。


コードをコピー コードは次のとおりです:
#include
名前空間 v8 を使用;
ハンドル<値> Add(const Arguments& args)

{
HandleScope スコープ;

//...また行きます!

}

引数

これは関数のパラメータです。まずはv8の公式マニュアルリファレンスを見てみましょう。

•int Length() const
•ローカル 演算子[](int i) const

残りは気にしない、この 2 つが重要です。 1 つは関数に渡されるパラメーターの数を表し、もう 1 つの括弧は添字インデックスを介して n 番目のパラメーターにアクセスするために使用されます。

したがって、args.Length() が 2、args[0] が a、args[1] が b を表すので、上記の要件を大まかに理解できます。そして、これら 2 つの数値の型が Number でなければならないことを判断する必要があります。

角括弧内のインデックス演算子は、Node.js のすべての型の基本クラスである Local を返すことに注意してください。したがって、渡されるパラメータは不確実な型であり、それがどのようなパラメータであるかを自分で判断する必要があります。これは、この値タイプのいくつかの関数に関連しています。

•IsArray()

•IsBoolean()
•IsDate()
•IsFunction()
•IsInt32()
•IsNativeError()
•IsNull()
•IsNumber()
•IsRegExp()
•IsString()
•...

それらを 1 つずつリストするつもりはありません。残りについてはドキュメントを読んでください。 。:.゚ヽ(*´∀`)ノ゚.:。

例外をスロー

これは後で使用する関数です。詳細については、v8 のドキュメントを参照してください。

名前が示すように、エラーをスローします。このステートメントの実行後は、Node.js ローカル ファイルで throw() ステートメントを実行するのと同じになります。例:

ThrowException(Exception::TypeError(String::New("引数の数が間違っています")));

これは、Node.js を実行するのと同じです:

throw new TypeError("引数の数が間違っています");

未定義()

この関数はドキュメントにも記載されています。

具体的には、一部の関数は特定の値を返す必要がないか、現時点では戻り値がないため、これは null 値です。

やってみよう、サオニアン!

上記の点を理解すれば、すぐに a b のロジックを書けるようになると思います。Node.js 公式マニュアルからコードをコピーして、実行してみましょう。


コードをコピー コードは次のとおりです:

#include
名前空間 v8 を使用;

ハンドル<値> Add(const Arguments& args)
{
HandleScope スコープ;

// 3 つ以上のパラメータを渡すことができることを意味しますが、実際には最初の 2 つだけを使用します
If(args.Length() {
// エラーをスローします
ThrowException(Exception::TypeError(String::New("引数の数が間違っています")));

// null 値を返す returnscope.Close(Unknown());
}

// 最初の 2 つのパラメータのいずれかが数値でない場合

If(!args[0]->IsNumber() || !args[1]->IsNumber())
{
// エラーをスローし、null 値を返します
ThrowException(Exception::TypeError(String::New("Wrong argument")));
returnscope.Close(Unknown());
}

// 詳細については、v8 ドキュメントを参照してください

//
http://izs.me/v8-docs/classv8_1_1Value.html#a6eac2b07dced58f1761bbfd53bf0e366) // `NumberValue` 関数
ローカル<数値> num = Number::New(args[0]->NumberValue() args[1]->NumberValue());

returnscope.Close(num);

}

機能は完了です!

最後にexport関数を記述すればOKです。


コードをコピー コードは次のとおりです:
void Init(ハンドル<オブジェクト> エクスポート)
{
エクスポート->Set(String::NewSymbol("add"),
FunctionTemplate::New(Add)->GetFunction());
}
NODE_MODULE(アドオン、初期化)


コンパイルしたら、次のように使用できます:

コードをコピーします コードは次のとおりです。
var addon = require('./build/Release/アドオン') ;
console.log(addon.add(1, 1) "b");

2b が見えます! ✧。٩(ˊᗜˋ)و✧*。

コールバック関数

前の章では、Hello world についてのみ説明しました。この章では、おばあちゃんが意識的な発見をし、別のコールバック関数を作成しました。

いつものように、最初にフレームワークを作成します。


コードをコピー コードは次のとおりです:
#include
名前空間 v8 を使用;
ハンドル<値>RunCallback(const Arguments& args)

{
HandleScope スコープ;

// ... パチパチパチパチ

returnscope.Close(Unknown());

}

そして、その使用法は次のように決定しました。

func(関数(msg) {
console.log(msg);
});

つまり、パラメータをコールバック関数に渡し、それを console.log() で出力できると想定します。

まず文字列シリーズが必要です

早速、最初に文字列を与えてから、それについて話しましょう。 (√ ε :)

ただし、Node.js コードの型指定が弱いため、この文字列をユニバーサル型にする必要があります。
Local::New(String::New("hello world"));

え? Local とは何ですか?

それでは、それについて少しお話しさせてください。ここと V8 リファレンス ドキュメントを参照してください。

ドキュメントに示されているように、Local は実際には Handle から継承されています。

それではローカルについて話しましょう。


ハンドルにはローカル ハンドルと永続ハンドルの 2 種類があり、それぞれローカル : ハンドル に違いはありません。ライフサイクルは範囲内です。後者のライフサイクルは範囲外であるため、そのライフサイクルを終了するには Persistent::Dispose を手動で呼び出す必要があります。つまり、ローカル ハンドルは C がスタック上にオブジェクトを割り当てることと同等であり、永続ハンドルは C がヒープ上にオブジェクトを割り当てることと同等です。

次に、パラメータテーブルシリーズが必要です

ターミナルのコマンドラインから C/C を呼び出した後、コマンドラインパラメータを取得するにはどうすればよいですか?

コードをコピー コードは次のとおりです:

#include

void main(int argc, char* argv[])
{
// ...
}

ちなみに、ここでのargcはコマンドラインパラメータの数、argv[]は各パラメータです。次に、Node.js のコールバック関数を呼び出します。v8 も同様の方法を採用しています。

コードをコピー コードは次のとおりです。
V8EXPORT Local v8::Function::Call(Handle<オブジェクト>recv ,
int argc,
ハンドル<値> argv[]
);

~~QAQ が Handle でスタックしています! ! !明日も続きを書きます。 ~~

さぁ、新しい一日が始まり、元気が湧いてきました。 (∩^o^)⊃━☆゚.*・。

多くの側面 (SegmentFault、StackOverflow、KouKou グループ) で検証した結果、上記の関数の 3 つのパラメーターの意味が最終的に解決されました。

次の 2 つのパラメータについては多くは説明しません。1 つはパラメータの数で、もう 1 つはパラメータの配列です。最初のパラメータ Handle については、StackOverflow の説明は次のとおりです。

JS での apply と同じです。

コードをコピー コードは次のとおりです:
var context = ...;
cb.apply(context, [ ...args...]);

最初の引数として渡されるオブジェクトは、関数スコープ内で this になります。JS について詳しくない場合は、ここで JS の詳細を参照してください。http://unschooled.org /2012/03/undering-javascript-this/

——StackOverflow

より抜粋

つまり、その機能は呼び出される関数の this ポインタを指定することです。この Call の使用法は、JavaScript の binding()、call()、および apply() に似ています。

したがって、私たちがしなければならないことは、最初にパラメータテーブルを構築し、次に実行のために Call 関数を渡すことです。

最初のステップは変換関数を表示することです。変換関数は元々オブジェクト型であるためです。
ローカル<関数> cb = ローカル<関数>::Cast(args[0]);

2 番目のステップは、パラメーター テーブル (配列) を作成することです:
Local argv[argc] = { Local::New(String::New("hello world")) };

ラストコール機能シリーズ

cb を呼び出してパラメータを渡します:
cb->Call(Context::GetCurrent()->Global(), 1, argv);

ここでの最初のパラメータ Context::GetCurrent()->Global() は、関数の this としてグローバル コンテキストを取得することを意味します。2 番目のパラメータはパラメータ テーブル内の番号です (結局、Node.js ですが)。配列には長さ属性がありますが、実際にはシステムは C の配列の長さを知らないため、配列の長さを示すために自分で数値を渡す必要があります); 最後のパラメーターは作成したばかりのパラメーター テーブルです。 。

最終章ファイナルドキュメントシリーズ

関数を作成し、それをエクスポートされた関数に入れて、最後に宣言するというこのステップについては、誰もがすでによく知っていると思います。

コードを直接リリースするだけですが、Node.js ドキュメントに直接アクセスすることもできます。

コードをコピー コードは次のとおりです:

#include
名前空間 v8 を使用;

ハンドル<値>RunCallback(const Arguments& args)
{
HandleScope スコープ;
ローカル cb = ローカル::Cast(args[0]);
const unsigned argc = 1;
Local argv[argc] = { Local::New(String::New("hello world")) };
cb->Call(Context::GetCurrent()->Global(), argc, argv);

returnscope.Close(Unknown());
}

void Init(Handle エクスポート、Handle モジュール)
{
モジュール -> Set(String::NewSymbol("exports"),
FunctionTemplate::New(RunCallback)->GetFunction());
}

NODE_MODULE(アドオン、初期化)

完了しました。残りの手順は自分で実行してください。この関数を JS で呼び出すことについては、以前に説明しました。

追加

さて、勉強ノートがどんどん自由になってきている気がしますので、分解してください~

今日はこの辺で、勉強ノートを書いている途中でCall関数のパラメータの意味などでまた困ってしまいました。

この一連の学習ノートがまだ役立つと思われる場合は、ぜひ一緒に楽しんでください〜Σ>―(〃°ω°〃)♡→

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

WLAN拡張モジュールが停止しました[修正] WLAN拡張モジュールが停止しました[修正] Feb 19, 2024 pm 02:18 PM

Windows コンピュータの WLAN 拡張モジュールに問題がある場合、インターネットから切断される可能性があります。この状況はイライラすることがよくありますが、幸いなことに、この記事では、この問題を解決し、ワイヤレス接続を再び正常に動作させるのに役立ついくつかの簡単な提案を提供します。 WLAN 拡張モジュールが停止しました。 WLAN 拡張モジュールが Windows コンピュータで動作を停止した場合は、次の提案に従って修正してください。 ネットワークとインターネットのトラブルシューティング ツールを実行して、ワイヤレス ネットワーク接続を無効にし、再度有効にします。 WLAN 自動構成サービスを再起動します。 電源オプションを変更します。 変更します。詳細な電源設定 ネットワーク アダプター ドライバーを再インストールする いくつかのネットワーク コマンドを実行する それでは、詳しく見てみましょう

WLAN 拡張モジュールを開始できません WLAN 拡張モジュールを開始できません Feb 19, 2024 pm 05:09 PM

この記事では、無線 LAN 拡張モジュールが起動できないことを示すイベント ID10000 を解決する方法について詳しく説明します。このエラーは、Windows 11/10 PC のイベント ログに表示される場合があります。 WLAN 拡張モジュールは、独立系ハードウェア ベンダー (IHV) および独立系ソフトウェア ベンダー (ISV) がカスタマイズされたワイヤレス ネットワーク機能をユーザーに提供できるようにする Windows のコンポーネントです。 Windows のデフォルト機能を追加することで、ネイティブ Windows ネットワーク コンポーネントの機能を拡張します。 WLAN 拡張モジュールは、オペレーティング システムがネットワーク コンポーネントをロードするときに、初期化の一部として開始されます。無線 LAN 拡張モジュールに問題が発生して起動できない場合、イベント ビューアのログにエラー メッセージが表示されることがあります。

C 言語の定数とは何ですか?例を挙げていただけますか? C 言語の定数とは何ですか?例を挙げていただけますか? Aug 28, 2023 pm 10:45 PM

定数は変数とも呼ばれ、一度定義されると、その値はプログラムの実行中に変更されません。したがって、変数を固定値を参照する定数として宣言できます。テキストとも呼ばれます。定数は、Const キーワードを使用して定義する必要があります。構文 C プログラミング言語で使用される定数の構文は次のとおりです - consttypeVariableName; (または) consttype*VariableName; さまざまなタイプの定数 C プログラミング言語で使用されるさまざまなタイプの定数は次のとおりです: 整数定数 - 例: 1,0 、34、4567 浮動小数点定数 - 例: 0.0、156.89、23.456 8 進数および 16 進数の定数 - 例: 16 進数: 0x2a、0xaa.. 8 進数

VSCode および VS C++ IntelliSense が機能しない、またはライブラリを選択しない VSCode および VS C++ IntelliSense が機能しない、またはライブラリを選択しない Feb 29, 2024 pm 01:28 PM

VS Code および Visual Studio C++ IntelliSense は、特に大規模なプロジェクトで作業している場合、ライブラリを選択できない場合があります。 #Include&lt;wx/wx.h&gt; の上にマウスを移動すると、「ソース ファイル 'string.h' を開けません」というエラー メッセージが表示され (「wx/wx.h」に応じて異なります)、オートコンプリート関数が応答しなくなることがあります。この記事では、VSCode および VSC++ IntelliSense が機能しない場合、またはライブラリを抽出できない場合の対処法を説明します。私のインテリセンスが C++ で動作しないのはなぜですか?大きなファイルを扱う場合、IntelliSense が機能しないことがあります。

Xboxエラーコード8C230002を修正 Xboxエラーコード8C230002を修正 Feb 27, 2024 pm 03:55 PM

エラー コード 8C230002 が原因で、Xbox でコンテンツを購入または視聴できませんか?一部のユーザーは、本体でコンテンツを購入または視聴しようとすると、引き続きこのエラーが発生します。申し訳ありませんが、Xbox サービスに問題があります。後でもう一度お試しください。この問題のヘルプが必要な場合は、www.xbox.com/errorhelp にアクセスしてください。ステータス コード: 8C230002 このエラー コードは通常、サーバーまたはネットワークの一時的な問題によって発生します。ただし、アカウントのプライバシー設定や保護者による制限など、他の理由により、特定のコンテンツの購入または表示が妨げられる場合があります。 Xbox エラー コード 8C230002 を修正する Xbox 本体でコンテンツを視聴または購入しようとしたときにエラー コード 8C が表示された場合

C++ で配列の最小要素と最大要素を見つける再帰的プログラム C++ で配列の最小要素と最大要素を見つける再帰的プログラム Aug 31, 2023 pm 07:37 PM

整数配列 Arr[] を入力として受け取ります。目標は、再帰的メソッドを使用して配列内の最大要素と最小要素を見つけることです。再帰を使用しているため、長さ = 1 に達するまで配列全体を反復処理し、基本ケースを形成する A[0] を返します。それ以外の場合、現在の要素は現在の最小値または最大値と比較され、その値は後続の要素に対して再帰的に更新されます。この場合のさまざまな入出力シナリオを見てみましょう −入力 −Arr={12,67,99,76,32}; 出力 −配列内の最大値: 99 説明 &mi

数字の螺旋パターンを出力する C++ プログラム 数字の螺旋パターンを出力する C++ プログラム Sep 05, 2023 pm 06:25 PM

数値をさまざまな形式で表示することは、学習における基本的なコーディング問題の 1 つです。条件文やループ文などのさまざまなコーディング概念。アスタリスクなどの特殊文字を使用して三角形や四角形を印刷するさまざまなプログラムがあります。この記事では、C++ の正方形と同じように、数値をスパイラル形式で出力します。行数 n を入力として受け取り、左上隅から開始して右、次に下、次に左、次に上、そして再び右、というように移動します。数字付きスパイラル パターン 123456724252627282982340414243309223948494431102138474645321120373635343312191817161514

Ansible の仕組みの詳細な説明 Ansible の仕組みの詳細な説明 Feb 18, 2024 pm 05:40 PM

Ansible の動作原理は上図から理解できます: 管理側は管理側への接続に local、ssh、zeromq の 3 つの方法をサポートしています。デフォルトでは ssh ベースの接続が使用されます。この部分は接続に相当します。上のアーキテクチャ図のモジュール; アプリケーション タイプを押すことができます HostInventory (ホスト リスト) の分類は他の方法で実行されます. 管理ノードはさまざまなモジュールを通じて対応する操作を実装します. 単一のモジュールと単一のコマンドのバッチ実行を ad と呼ぶことができます-hoc; 管理ノードは、プレイブックを通じて複数のタスクのコレクションを実装できます。Web サービスのインストールとデプロイ、データベース サーバーのバッチ バックアップなど、ある種の機能を実装します。プレイブックは、システムが通過すると単純に理解できます。

See all articles