Rumah hujung hadapan web tutorial js Gunakan C/C untuk melaksanakan modul Node.js (2)_node.js

Gunakan C/C untuk melaksanakan modul Node.js (2)_node.js

May 16, 2016 pm 04:35 PM
c node.js modul

Mengkaji masa lalu dan mempelajari perkara baharu boleh menggembirakan anda

Pertama sekali, sila ingat manual dalam talian V8 ini - http://izs.me/v8-docs/main.html.

Adakah anda masih ingat fail building.gyp dari kali terakhir?

Salin kod Kod adalah seperti berikut:

{
"sasaran": [
{
"target_name": "tambah",
"sumber": [ "addon.cc" ]
}
]
}

Sama seperti ini, jika anda mempunyai beberapa fail *.cc lagi, ia akan kelihatan seperti ini:
"sources": [ "addon.cc", "myexample.cc" ]

Kali terakhir kami memisahkan dua langkah sebenarnya, konfigurasi dan kompilasi boleh disatukan:
$ node-gyp configure build

Adakah anda sudah selesai membuat semakan? tanpa? !

Baiklah, mari teruskan.

Jadual Kandungan

Parameter fungsi

Kini kita akhirnya perlu bercakap tentang parameter.

Mari kita bayangkan bahawa terdapat fungsi add(a, b) sedemikian yang mewakili penambahan a dan b dan mengembalikan hasilnya, jadi tulis dahulu rangka fungsi:

Salin kod Kod adalah seperti berikut:

#include
menggunakan ruang nama v8;

Kendalikan(Const Arguments& args)
{
Skop HandleScope;

//... Di sini kita pergi lagi!
}

Hujah

Ini ialah parameter fungsi. Mari kita lihat rujukan manual rasmi v8 dahulu.
•int Length() const
•Pengendali tempatan[](int i) const

Kami tidak peduli tentang yang lain, kedua-dua ini penting! Satu mewakili bilangan parameter yang dihantar ke dalam fungsi, dan kurungan lain digunakan untuk mengakses parameter ke-n melalui indeks subskrip.

Oleh itu, kita boleh memahami secara kasar keperluan di atas sebagai args. Length() ialah 2, args[0] mewakili a dan args[1] mewakili b. Dan kita perlu menentukan bahawa jenis kedua-dua nombor ini mestilah Nombor.

Perhatikan bahawa pengendali indeks dalam kurungan segi empat sama mengembalikan Local, iaitu kelas asas semua jenis dalam Node.js. Oleh itu, parameter yang diluluskan adalah jenis yang tidak pasti, dan kita mesti menentukan sendiri apakah parameter tersebut. Ini berkaitan dengan beberapa fungsi jenis Nilai ini.

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

Saya tidak akan menyenaraikannya satu persatu, anda boleh membaca dokumentasi untuk selebihnya. 。:.゚ヽ(*´∀`)ノ゚.:。

ThrowException

Ini adalah fungsi yang akan kami gunakan nanti. Butiran boleh didapati dalam dokumentasi v8.

Seperti namanya, ia menimbulkan ralat. Selepas melaksanakan penyataan ini, ia adalah bersamaan dengan melaksanakan penyataan throw() dalam fail setempat Node.js. Contohnya:
ThrowException(Exception::TypeError(String::New("Nombor argumen yang salah")));

Ia bersamaan dengan melaksanakan Node.js:
buang TypeError baru("Bilangan argumen yang salah");

Undefined()

Fungsi ini juga terdapat dalam dokumentasi.

Secara khusus, ia adalah nilai nol, kerana sesetengah fungsi tidak perlu mengembalikan sebarang nilai tertentu, atau tiada nilai pulangan Pada masa ini, Undefined() perlu digunakan.

Jom lakukannya, Saonian!

Selepas memahami perkara di atas, saya percaya anda akan dapat menulis logik a b tidak lama lagi. Saya akan menyalin kod daripada manual rasmi Node.js dan memberikannya kepada anda untuk melalui:

Salin kod Kod adalah seperti berikut:

#include
menggunakan ruang nama v8;

Kendalikan(Const Arguments& args)
{
Skop HandleScope;

// bermaksud lebih daripada 2 parameter boleh dihantar, tetapi sebenarnya kami hanya menggunakan dua yang pertama
If(args.Length() < 2)
{
// ​ ralat lontaran
         ThrowException(Exception::TypeError(String::New("Nombor hujah salah")));

// Kembalikan nilai nol
          kembali skop. Tutup(Tidak Ditakrifkan());
}

// Jika salah satu daripada dua parameter pertama bukan nombor
If(!args[0]->IsNumber() || !args[1]->IsNumber())
{
                 // Lemparkan ralat dan kembalikan nilai nol
         ThrowException(Exception::TypeError(String::New("Argumen salah")));
          kembali skop. Tutup(Tidak Ditakrifkan());
}

// Sila rujuk dokumentasi v8 untuk butiran
// http://izs.me/v8-docs/classv8_1_1Value.html#a6eac2b07dced58f1761bbfd53bf0e366)
// Fungsi `NumberValue`
Setempat num = Number::New(args[0]->NumberValue() args[1]->NumberValue());

kembalikan skop. Tutup(bilangan);
}

Fungsi selesai!

Akhir sekali, tulis fungsi eksport pada penghujung dan ia OK.

Salin kod Kod adalah seperti berikut:

void Init(Mengendalikan eksport)
{
eksport->Set(String::NewSymbol("add"),
FunctionTemplate::Baharu(Tambah)->GetFunction());
}

MODUL_NODE(tambahan, Init)


Selepas anda menyusunnya, kita boleh menggunakannya seperti ini:

Salin kod Kod adalah seperti berikut:
var addon = require('./build/Release/ addon') ;
console.log(addon.add(1, 1) "b");

Anda akan melihat 2b! ✧。٩(ˊᗜˋ)و✧*。

Fungsi panggil balik

Dalam bab lepas, kami hanya bercakap tentang Hello world Dalam bab ini, Nenek membuat penemuan secara sedar dan menulis fungsi panggil balik yang lain.

Seperti biasa, kami menulis rangka kerja dahulu:

Salin kod Kod adalah seperti berikut:

#include
menggunakan ruang nama v8;

Kendalikan RunCallback(Const Arguments& args)
{
Skop HandleScope;

// ... berderak berderak

kembalikan skop. Tutup(Tidak Ditakrifkan());
}

Kemudian kami memutuskan untuk menggunakannya seperti ini:
func(function(msg) {
console.log(msg);
});

Iaitu, ia akan menghantar parameter ke fungsi panggil balik Kami membayangkan ia adalah rentetan, dan kemudian kami boleh console.log() keluar.

Mula-mula anda perlu mempunyai siri rentetan

Tanpa berlengah-lengah lagi, mari kita berikan satu rentetan dahulu dan kemudian bercakap mengenainya. (√ ζ ε:)

Tetapi kita perlu menjadikan rentetan ini jenis universal, kerana kod Node.js ditaip dengan lemah.
Setempat::Baharu(String::New("hello world"));

Apa? Anda bertanya kepada saya apakah itu?

Kemudian izinkan saya bercakap mengenainya sedikit, rujuk di sini dan dokumen rujukan V8.

Seperti yang ditunjukkan dalam dokumentasi, Local sebenarnya mewarisi daripada Handle Saya masih ingat bahawa Handle

Kemudian mari bercakap tentang Tempatan.


Terdapat dua jenis Handle, Local Handle dan Persistent Handle, masing-masing ialah Handle dan Persistent Kitaran hayat berada dalam skop. Kitaran hayat yang terakhir adalah di luar skop, dan anda perlu memanggil Persistent::Dispose secara manual untuk menamatkan kitaran hayatnya. Dalam erti kata lain, Local Handle adalah bersamaan dengan C `memperuntukkan objek pada timbunan dan Persistent Handle adalah bersamaan dengan C memperuntukkan objek pada timbunan.

Kemudian anda perlu mempunyai siri jadual parameter

Bagaimana untuk mendapatkan parameter baris arahan selepas memanggil C/C dari baris arahan terminal?

Salin kod Kod adalah seperti berikut:

#include

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

By the way, argc di sini ialah bilangan parameter baris arahan dan argv[] ialah setiap parameter. Kemudian memanggil fungsi panggil balik Node.js, v8 juga menggunakan kaedah yang serupa:

Salin kod Kod adalah seperti berikut:
V8EXPORT Local v8::Fungsi::Panggil(Handle< Objek>recv ,
int argc,
Mengendalikan argv[]
);

~~QAQ tersekat dalam Handle ! ! Akan sambung menulis esok. ~~

Nah, hari baru telah bermula dan saya berasa penuh kekuatan. (∩^o^)⊃━☆゚.*・。

Selepas saya mengesahkannya dalam banyak aspek (SegmentFault, StackOverflow dan kumpulan KouKou), saya akhirnya menyelesaikan maksud tiga parameter fungsi di atas.

Saya tidak akan bercakap banyak tentang dua parameter seterusnya Satu ialah bilangan parameter, dan satu lagi ialah susunan parameter. Bagi parameter pertama Handle recv, penjelasan StackOverflow ialah:


Ia adalah sama seperti memohon dalam JS, anda lakukan

Salin kod Kod adalah seperti berikut:

konteks var = ...;
cb.apply(konteks, [ ...args...]);

Objek diluluskan sebagai hujah pertama menjadi ini dalam skop fungsi Lebih banyak dokumentasi pada MDN Jika anda tidak mengetahui JS dengan baik, anda boleh membaca lebih lanjut tentang JS ini di sini: http://unschooled.org. /2012/03/understanding-javascript-this/

——Dipetik daripada StackOverflow

Ringkasnya, fungsinya adalah untuk menentukan penunjuk ini bagi fungsi yang dipanggil. Penggunaan Panggilan ini serupa dengan bind(), call(), dan apply() dalam JavaScript.

Jadi apa yang perlu kita lakukan ialah membina jadual parameter dahulu, dan kemudian masukkan fungsi Panggilan untuk pelaksanaan.

Langkah pertama ialah memaparkan fungsi penukaran, kerana ia pada asalnya jenis Objek:
Setempat cb = Setempat::Cast(args[0]);

Langkah kedua ialah mencipta jadual parameter (tatasusunan):
Setempat argv[argc] = { Setempat::Baru(String::Baru("hello world")) };

Siri fungsi panggilan terakhir

Panggil cb dan hantar parameter dalam:
cb->Panggil(Konteks::GetCurrent()->Global(), 1, argv);

Parameter pertama di sini, Context::GetCurrent()->Global(), bermakna mendapatkan konteks global seperti ini bagi fungsi ini; parameter kedua ialah nombor dalam jadual parameter (walaupun Node.js Tatasusunan mempunyai atribut panjang, tetapi sistem sebenarnya tidak mengetahui panjang tatasusunan dalam C, dan anda perlu memasukkan nombor sendiri untuk menunjukkan panjang tatasusunan yang terakhir ialah jadual parameter yang baru kami buat .

Siri Dokumen Akhir Bab Akhir

Saya percaya semua orang sudah biasa dengan langkah ini, iaitu menulis fungsi, kemudian memasukkannya ke dalam fungsi yang dieksport, dan akhirnya mengisytiharkannya.

Saya hanya akan melepaskan kod terus, atau anda boleh pergi terus ke dokumentasi Node.js.

Salin kod Kod adalah seperti berikut:

#include
menggunakan ruang nama v8;

Kendalikan RunCallback(Const Arguments& args)
{
Skop HandleScope;
Setempat cb = Setempat::Cast(args[0]);
const unsigned argc = 1;
Setempat argv[argc] = { Setempat::Baru(String::Baru("hello world")) };
cb->Panggil(Konteks::GetCurrent()->Global(), argc, argv);

kembalikan skop. Tutup(Tidak Ditakrifkan());
}

batal Init(Mengendalikan eksport, Modul Mengendalikan)
{
Modul->Set(String::NewSymbol("eksport"),
FunctionTemplate::New(RunCallback)->GetFunction());
}

MODUL_NODE(tambahan, Init)

Syabas! Lakukan sendiri langkah terakhir yang tinggal. Bagi memanggil fungsi ini dalam JS, saya telah menyebutnya sebelum ini.

Tambahan

Yalah, saya rasa nota belajar saya semakin tidak terkawal~

Mari berhenti di sini hari ini Dalam proses menulis nota kajian, saya menghadapi masalah lagi, seperti maksud parameter fungsi Panggilan.

Jika anda rasa siri nota pembelajaran ini masih membantu anda, datang dan sertai saya dalam keseronokan~Σ>―(〃°ω°〃)♡→

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Modul pengembangan WLAN telah berhenti [fix] Modul pengembangan WLAN telah berhenti [fix] Feb 19, 2024 pm 02:18 PM

Jika terdapat masalah dengan modul pengembangan WLAN pada komputer Windows anda, ia mungkin menyebabkan anda terputus sambungan daripada Internet. Keadaan ini sering mengecewakan, tetapi mujurlah, artikel ini menyediakan beberapa cadangan mudah yang boleh membantu anda menyelesaikan masalah ini dan membolehkan sambungan wayarles anda berfungsi dengan baik semula. Betulkan Modul Kebolehlanjutan WLAN Telah Berhenti Jika Modul Kebolehlanjutan WLAN telah berhenti berfungsi pada komputer Windows anda, ikuti cadangan ini untuk membetulkannya: Jalankan Penyelesai Masalah Rangkaian dan Internet untuk melumpuhkan dan mendayakan semula sambungan rangkaian wayarles Mulakan semula Perkhidmatan Konfigurasi Auto WLAN Ubah Suai Pilihan Kuasa Ubah suai Tetapan Kuasa Lanjutan Pasang Semula Pemacu Penyesuai Rangkaian Jalankan Beberapa Perintah Rangkaian Sekarang, mari kita lihat secara terperinci

Modul kebolehlanjutan WLAN tidak boleh dimulakan Modul kebolehlanjutan WLAN tidak boleh dimulakan Feb 19, 2024 pm 05:09 PM

Artikel ini memperincikan kaedah untuk menyelesaikan ID10000 peristiwa, yang menunjukkan bahawa modul pengembangan LAN Wayarles tidak boleh dimulakan. Ralat ini mungkin muncul dalam log peristiwa Windows 11/10 PC. Modul kebolehlanjutan WLAN ialah komponen Windows yang membenarkan vendor perkakasan bebas (IHV) dan vendor perisian bebas (ISV) untuk menyediakan pengguna dengan ciri dan fungsi rangkaian wayarles tersuai. Ia memanjangkan keupayaan komponen rangkaian Windows asli dengan menambahkan fungsi lalai Windows. Modul kebolehlanjutan WLAN dimulakan sebagai sebahagian daripada permulaan apabila sistem pengendalian memuatkan komponen rangkaian. Jika Modul Pengembangan LAN Wayarles menghadapi masalah dan tidak boleh dimulakan, anda mungkin melihat mesej ralat dalam log dalam Pemapar Acara.

Apakah pemalar dalam bahasa C Bolehkah anda berikan contoh? Apakah pemalar dalam bahasa C Bolehkah anda berikan contoh? Aug 28, 2023 pm 10:45 PM

Pemalar juga dipanggil pembolehubah dan apabila ditakrifkan, nilainya tidak berubah semasa pelaksanaan program. Oleh itu, kita boleh mengisytiharkan pembolehubah sebagai pemalar merujuk nilai tetap. Ia juga dipanggil teks. Pemalar mesti ditakrifkan menggunakan kata kunci Const. Sintaks Sintaks pemalar yang digunakan dalam bahasa pengaturcaraan C adalah seperti berikut - consttypeVariableName; ,34, 4567 Pemalar titik terapung - Contoh: 0.0, 156.89, 23.456 Pemalar perlapanan dan Perenambelasan - Contoh: Hex: 0x2a, 0xaa.. Octal

VSCode dan VS C++ IntelliSense tidak berfungsi atau mengambil perpustakaan VSCode dan VS C++ IntelliSense tidak berfungsi atau mengambil perpustakaan Feb 29, 2024 pm 01:28 PM

Kod VS dan Visual Studio C++ IntelliSense mungkin tidak dapat mengambil perpustakaan, terutamanya apabila bekerja pada projek besar. Apabila kami menuding pada #Include&lt;wx/wx.h&gt;, kami melihat mesej ralat "Tidak boleh Membuka fail sumber 'string.h'" (bergantung pada "wx/wx.h") dan kadangkala, Fungsi autolengkap tidak bertindak balas. Dalam artikel ini kita akan melihat perkara yang boleh anda lakukan jika VSCode dan VSC++ IntelliSense tidak berfungsi atau mengekstrak perpustakaan. Mengapa Intellisense saya tidak berfungsi dalam C++? Apabila bekerja dengan fail besar, kadangkala IntelliSense

Betulkan kod ralat Xbox 8C230002 Betulkan kod ralat Xbox 8C230002 Feb 27, 2024 pm 03:55 PM

Adakah anda tidak dapat membeli atau menonton kandungan pada Xbox anda kerana kod ralat 8C230002? Sesetengah pengguna terus mendapat ralat ini apabila cuba membeli atau menonton kandungan pada konsol mereka. Maaf, terdapat masalah dengan perkhidmatan Xbox. Cuba lagi nanti. Untuk bantuan dengan isu ini, lawati www.xbox.com/errorhelp. Kod Status: 8C230002 Kod ralat ini biasanya disebabkan oleh masalah pelayan atau rangkaian sementara. Walau bagaimanapun, mungkin terdapat sebab lain, seperti tetapan privasi akaun anda atau kawalan ibu bapa, yang mungkin menghalang anda daripada membeli atau melihat kandungan tertentu. Betulkan Kod Ralat Xbox 8C230002 Jika anda menerima kod ralat 8C semasa cuba menonton atau membeli kandungan pada konsol Xbox anda

Program rekursif untuk mencari elemen minimum dan maksimum tatasusunan dalam C++ Program rekursif untuk mencari elemen minimum dan maksimum tatasusunan dalam C++ Aug 31, 2023 pm 07:37 PM

Kami mengambil tatasusunan integer Arr[] sebagai input. Matlamatnya adalah untuk mencari elemen terbesar dan terkecil dalam tatasusunan menggunakan kaedah rekursif. Memandangkan kami menggunakan rekursi, kami akan mengulangi keseluruhan tatasusunan sehingga kami mencapai panjang = 1 dan kemudian mengembalikan A[0], yang membentuk huruf asas. Jika tidak, elemen semasa dibandingkan dengan nilai minimum atau maksimum semasa dan nilainya dikemas kini secara rekursif untuk elemen berikutnya. Mari kita lihat pelbagai senario input dan output untuk −Input −Arr={12,67,99,76,32}; Nilai maksimum dalam tatasusunan: 99 Penjelasan &mi

Program C++ untuk mencetak corak lingkaran nombor Program C++ untuk mencetak corak lingkaran nombor Sep 05, 2023 pm 06:25 PM

Memaparkan nombor dalam format yang berbeza adalah salah satu masalah pengekodan asas pembelajaran. Konsep pengekodan yang berbeza seperti pernyataan bersyarat dan pernyataan gelung. Terdapat program yang berbeza di mana kami menggunakan aksara khas seperti asterisk untuk mencetak segi tiga atau segi empat sama. Dalam artikel ini, kami akan mencetak nombor dalam bentuk lingkaran, sama seperti petak dalam C++. Kami mengambil bilangan baris n sebagai input dan bermula dari sudut kiri atas dan bergerak ke kanan, kemudian ke bawah, kemudian ke kiri, kemudian ke atas, kemudian ke kanan lagi, dan seterusnya dan seterusnya. Corak lingkaran dengan nombor 123456724252627282982340414243309223948494431102138474645321120373635343312191817161514

Penjelasan terperinci tentang cara Ansible berfungsi Penjelasan terperinci tentang cara Ansible berfungsi Feb 18, 2024 pm 05:40 PM

Prinsip kerja Ansible boleh difahami dari rajah di atas: hujung pengurusan menyokong tiga kaedah tempatan, ssh, dan zeromq untuk menyambung ke hujung terurus Lalai adalah menggunakan sambungan berasaskan ssh dalam gambar rajah seni bina di atas; ia boleh disambungkan mengikut jenis aplikasi HostInventory (senarai hos) dilakukan dengan cara lain Nod pengurusan melaksanakan operasi yang sepadan melalui pelbagai modul Satu modul dan pelaksanaan satu kumpulan boleh dipanggil iklan -hoc; nod pengurusan boleh melaksanakan koleksi berbilang tugas melalui buku permainan, seperti pemasangan dan penggunaan perkhidmatan web, sandaran kumpulan pelayan pangkalan data, dll. Kita hanya boleh memahami buku permainan kerana, sistem berlalu

See all articles