Tôi thực sự có được chính xác những gì bạn (và tôi) muốn, mà không cần sử dụng sự chờ đợi, Hứa hẹn hoặc bao gồm bất kỳ thư viện (bên ngoài) nào (ngoại trừ thư viện của chúng tôi).
Đây là cách thực hiện:
Chúng ta sẽ tạo một mô-đun C ++ để đi với node.js và chức năng mô-đun C ++ đó sẽ thực hiện yêu cầu HTTP và trả về dữ liệu dưới dạng một chuỗi và bạn có thể sử dụng trực tiếp bằng cách thực hiện:
var myData = newModule.get(url);
BẠN ĐÃ SN SÀNG để bắt đầu?
Bước 1: Tạo một thư mục mới ở một nơi khác trên máy tính của bạn, chúng tôi chỉ sử dụng thư mục này để xây dựng tệp module.node (được biên dịch từ C ++), bạn có thể di chuyển nó sau.
Trong thư mục mới (tôi đặt của tôi trong mynewFolder / src cho tổ chức-ness):
npm init
sau đó
npm install node-gyp -g
bây giờ tạo 2 tệp mới: 1, được gọi là something.cpp và đặt mã này vào đó (hoặc sửa đổi nếu bạn muốn):
#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);
Bây giờ hãy tạo một tệp mới trong cùng một thư mục được gọi something.gyp
và đặt (một cái gì đó giống như) trong đó:
{
"targets": [
{
"target_name": "cobypp",
"sources": [ "src/cobypp.cpp" ]
}
]
}
Bây giờ trong tệp package.json, hãy thêm: "gypfile": true,
Bây giờ: trong bảng điều khiển, node-gyp rebuild
Nếu nó đi qua toàn bộ lệnh và nói "ok" ở cuối mà không có lỗi, bạn (gần như) tốt để tiếp tục, nếu không, hãy để lại nhận xét ..
Nhưng nếu nó hoạt động thì hãy truy cập build / Release / cobypp.node (hoặc bất cứ thứ gì nó được gọi cho bạn), sao chép nó vào thư mục node.js chính của bạn, sau đó trong node.js:
var myCPP = require("./cobypp")
var myData = myCPP.get("http://google.com").result;
console.log(myData);
..
response.end(myData);//or whatever