मुझे वास्तव में वही मिला, जो आप (और मेरे) चाहते थे, बिना किसी प्रतीक्षा के, प्रोमिस या किसी भी (बाहरी) पुस्तकालय (हमारे अपने को छोड़कर) के उपयोग के बिना।
यह कैसे करना है:
हम नोड C.js के साथ जाने के लिए C ++ मॉड्यूल बनाने जा रहे हैं, और C ++ मॉड्यूल फ़ंक्शन HTTP अनुरोध करेगा और डेटा को एक स्ट्रिंग के रूप में वापस करेगा, और आप इसे सीधे करके उपयोग कर सकते हैं:
var myData = newModule.get(url);
क्या आप आरंभ करने के लिए तैयार हैं ?
चरण 1: अपने कंप्यूटर पर कहीं और एक नया फ़ोल्डर बनाएं, हम केवल इस फ़ोल्डर का उपयोग मॉड्यूल.नोड फ़ाइल (C ++ से संकलित) बनाने के लिए कर रहे हैं, आप इसे बाद में स्थानांतरित कर सकते हैं।
नए फ़ोल्डर में (मैंने ऑर्गन-नेस के लिए mynewFolder / src में अपना नाम डाला):
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" ]
}
]
}
अब package.json फ़ाइल में, जोड़ें: "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);//or whatever