Ich habe genau das bekommen, was Sie (und ich) wollten, ohne Wartezeiten, Versprechen oder Einschlüsse einer (externen) Bibliothek (außer unserer eigenen).
So geht's:
Wir werden ein C ++ - Modul erstellen, das zu node.js passt, und diese C ++ - Modulfunktion wird die HTTP-Anforderung stellen und die Daten als Zeichenfolge zurückgeben. Sie können dies direkt verwenden, indem Sie Folgendes tun:
var myData = newModule.get(url);
SIND SIE BEREIT , loszulegen?
Schritt 1: Erstellen Sie einen neuen Ordner an einer anderen Stelle auf Ihrem Computer. Wir verwenden diesen Ordner nur zum Erstellen der Datei module.node (kompiliert aus C ++). Sie können sie später verschieben.
In dem neuen Ordner (ich habe meinen in mynewFolder / src für die Organisation abgelegt):
npm init
dann
npm install node-gyp -g
Jetzt mache 2 neue Dateien: 1, etwas.cpp genannt und füge diesen Code ein (oder ändere ihn, wenn du willst):
#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);
Erstellen Sie nun eine neue Datei im selben Verzeichnis mit dem Namen something.gyp
und legen Sie (so etwas) darin ab:
{
"targets": [
{
"target_name": "cobypp",
"sources": [ "src/cobypp.cpp" ]
}
]
}
Fügen Sie nun in der Datei package.json Folgendes hinzu: "gypfile": true,
Jetzt: in der Konsole, node-gyp rebuild
Wenn es den gesamten Befehl durchläuft und am Ende fehlerfrei "ok" sagt, können Sie (fast) loslegen. Wenn nicht, hinterlassen Sie einen Kommentar.
Wenn es funktioniert, gehen Sie zu build / Release / cobypp.node (oder wie auch immer es für Sie heißt), kopieren Sie es in Ihren Hauptordner node.js und dann in node.js:
var myCPP = require("./cobypp")
var myData = myCPP.get("http://google.com").result;
console.log(myData);
..
response.end(myData);//or whatever