ฉันได้สิ่งที่คุณ (และฉัน) ต้องการจริงๆโดยไม่ต้องใช้การรอคอยสัญญาหรือการรวมไลบรารีใด ๆ (ภายนอก) (ยกเว้นของเราเอง)
วิธีการทำมีดังนี้
เรากำลังจะสร้างโมดูล C ++ เพื่อใช้งานร่วมกับ node.js และฟังก์ชันโมดูล C ++ นั้นจะทำการร้องขอ HTTP และส่งคืนข้อมูลเป็นสตริงและคุณสามารถใช้สิ่งนั้นได้โดยตรงโดยทำ:
var myData = newModule.get(url);
คุณพร้อมที่จะเริ่มต้นแล้วหรือยัง?
ขั้นตอนที่ 1: สร้างโฟลเดอร์ใหม่ที่อื่นในคอมพิวเตอร์ของคุณเราใช้โฟลเดอร์นี้เพื่อสร้างไฟล์ module.node เท่านั้น (คอมไพล์จาก C ++) คุณสามารถย้ายได้ในภายหลัง
ในโฟลเดอร์ใหม่ (ฉันใส่ของฉันไว้ใน mynewFolder / src เพื่อจัดระเบียบ - เนส):
npm init
แล้ว
npm install node-gyp -g
ตอนนี้สร้างไฟล์ใหม่ 2 ไฟล์: 1 เรียกว่า something.cpp และสำหรับใส่รหัสนี้ (หรือแก้ไขถ้าคุณต้องการ):
#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
หากผ่านคำสั่งทั้งหมดและพูดว่า "ok" ในตอนท้ายโดยไม่มีข้อผิดพลาดแสดงว่าคุณ (เกือบ) ดีไปแล้วถ้าไม่ใช่ก็แสดงความคิดเห็น ..
แต่ถ้ามันใช้งานได้ให้ไปที่ build / Release / cobypp.node (หรืออะไรก็ได้ที่เรียกร้องให้คุณ) คัดลอกลงในโฟลเดอร์ node.js หลักจากนั้นใน node.js:
var myCPP = require("./cobypp")
var myData = myCPP.get("http://google.com").result;
console.log(myData);
..
response.end(myData);