আপনি (এবং আমি) কোনও (বাহ্যিক) লাইব্রেরির (আমাদের নিজস্ব ব্যতীত) অপেক্ষা, প্রতিশ্রুতি বা অন্তর্ভুক্তি ব্যবহার না করে আপনি (এবং আমি) যা চেয়েছিলেন তা হুবহু পেয়েছি।
এটি কীভাবে করবেন তা এখানে:
আমরা নোড.জেএস সাথে যেতে একটি সি ++ মডিউল তৈরি করতে যাচ্ছি, এবং সেই সি ++ মডিউল ফাংশন এইচটিটিপি অনুরোধ করবে এবং তথ্যটিকে স্ট্রিং হিসাবে ফিরিয়ে দেবে, এবং আপনি সরাসরি এটি করে ব্যবহার করতে পারেন:
var myData = newModule.get(url);
আপনি কি শুরু করার জন্য প্রস্তুত ?
পদক্ষেপ 1: আপনার কম্পিউটারে অন্য কোথাও একটি নতুন ফোল্ডার তৈরি করুন, আমরা কেবলমাত্র মডিউল.নোড ফাইল (সি ++ থেকে সংকলিত) তৈরি করতে এই ফোল্ডারটি ব্যবহার করছি, আপনি এটি পরে স্থানান্তর করতে পারেন।
নতুন ফোল্ডারে (আমি সংগঠন-নেসের জন্য আমার নতুন ফোল্ডার / এসসিআর-এ আমার রাখি):
npm init
তারপর
npm install node-gyp -g
এখন 2 টি নতুন ফাইল তৈরি করুন: 1, যাকে কিছু বলা হয় সিপিসিপি এবং এতে এই কোডটি রাখার জন্য (বা আপনি চাইলে এটি পরিবর্তন করুন):
#pragma comment(lib, "urlmon.lib")
#include <sstream>
#include <WTypes.h>
#include <node.h>
#include <urlmon.h>
#include <iostream>
using namespace std;
using namespace v8;
Local<Value> S(const char* inp, Isolate* is) {
return String::NewFromUtf8(
is,
inp,
NewStringType::kNormal
).ToLocalChecked();
}
Local<Value> N(double inp, Isolate* is) {
return Number::New(
is,
inp
);
}
const char* stdStr(Local<Value> str, Isolate* is) {
String::Utf8Value val(is, str);
return *val;
}
double num(Local<Value> inp) {
return inp.As<Number>()->Value();
}
Local<Value> str(Local<Value> inp) {
return inp.As<String>();
}
Local<Value> get(const char* url, Isolate* is) {
IStream* stream;
HRESULT res = URLOpenBlockingStream(0, url, &stream, 0, 0);
char buffer[100];
unsigned long bytesReadSoFar;
stringstream ss;
stream->Read(buffer, 100, &bytesReadSoFar);
while(bytesReadSoFar > 0U) {
ss.write(buffer, (long long) bytesReadSoFar);
stream->Read(buffer, 100, &bytesReadSoFar);
}
stream->Release();
const string tmp = ss.str();
const char* cstr = tmp.c_str();
return S(cstr, is);
}
void Hello(const FunctionCallbackInfo<Value>& arguments) {
cout << "Yo there!!" << endl;
Isolate* is = arguments.GetIsolate();
Local<Context> ctx = is->GetCurrentContext();
const char* url = stdStr(arguments[0], is);
Local<Value> pg = get(url,is);
Local<Object> obj = Object::New(is);
obj->Set(ctx,
S("result",is),
pg
);
arguments.GetReturnValue().Set(
obj
);
}
void Init(Local<Object> exports) {
NODE_SET_METHOD(exports, "get", Hello);
}
NODE_MODULE(cobypp, Init);
এখন একই ডিরেক্টরিতে একটি নতুন ফাইল তৈরি করুন এবং এতে এটি something.gyp
(এমন কিছু) রাখুন:
{
"targets": [
{
"target_name": "cobypp",
"sources": [ "src/cobypp.cpp" ]
}
]
}
এখন প্যাকেজ.জসন ফাইলে যোগ করুন: "gypfile": true,
এখন: কনসোলে, node-gyp rebuild
যদি এটি পুরো কমান্ডটি অতিক্রম করে এবং কোনও ত্রুটি না করে শেষে "ঠিক আছে" বলে, আপনি (প্রায়) ভাল, যদি না হয় তবে ভাল মন্তব্য করুন ..
তবে যদি এটি কাজ করে তবে বিল্ড / রিলিজ / cobypp.node (অথবা এটি আপনার জন্য যা কিছু বলবে) যান, আপনার মূল নোড.জেএস ফোল্ডারে কপি করুন, তারপরে নোড.জেজে:
var myCPP = require("./cobypp")
var myData = myCPP.get("http://google.com").result;
console.log(myData);
..
response.end(myData);