https://github.com/joyent/node html
若是用svn下載,後面加上/trunk,以避免把用不着的branches也下載下來,浪費時間。 node
http://www.python.org/download/ python
注意不能是3.x, 由於node-gyp目前須要2.x. 我安裝的是2.7。 c++
成功後,會生成Release或者Debug目錄以及其餘文件。個人生成是Release目錄。咱們須要的是這個路徑下的node.lib 文件,以便在咱們的c++項目中引用。 git
在main.cpp引用main.h文件。 github
#include "main.h" express
因爲main.h是放在include文件夾中,須要設置一下才能夠。 json
https://nodejs.org/api/addons.html#addons_wrapping_c_objects api
複製代碼並更改,如下是具體文件的代碼: app
Main.h 空。
Main.cpp:
#include "main.h" #include <node.h> #include "myobject.h"
using namespace v8;
void InitAll(Handle<Object> exports) { MyObject::Init(exports); }
NODE_MODULE(myaddon2, InitAll) |
Myobject.h
#ifndef MYOBJECT_H #define MYOBJECT_H
#include <node.h> #include <node_object_wrap.h>
class MyObject : public node::ObjectWrap { public: static void Init(v8::Handle<v8::Object> exports);
private: explicit MyObject(double value = 0); ~MyObject();
static void New(const v8::FunctionCallbackInfo<v8::Value>& args); static void PlusOne(const v8::FunctionCallbackInfo<v8::Value>& args); static v8::Persistent<v8::Function> constructor; double value_; };
#endif |
Myobject.cpp
#include "myobject.h"
using namespace v8;
Persistent<Function> MyObject::constructor;
MyObject::MyObject(double value) : value_(value) { }
MyObject::~MyObject() { }
void MyObject::Init(Handle<Object> exports) { Isolate* isolate = Isolate::GetCurrent();
// Prepare constructor template Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, New); tpl->SetClassName(String::NewFromUtf8(isolate, "MyObject")); tpl->InstanceTemplate()->SetInternalFieldCount(1);
// Prototype NODE_SET_PROTOTYPE_METHOD(tpl, "plusOne", PlusOne);
constructor.Reset(isolate, tpl->GetFunction()); exports->Set(String::NewFromUtf8(isolate, "MyObject"), tpl->GetFunction()); }
void MyObject::New(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = Isolate::GetCurrent(); HandleScope scope(isolate);
if (args.IsConstructCall()) { // Invoked as constructor: `new MyObject(...)` double value = args[0]->IsUndefined() ? 0 : args[0]->NumberValue(); MyObject* obj = new MyObject(value); obj->Wrap(args.This()); args.GetReturnValue().Set(args.This()); } else { // Invoked as plain function `MyObject(...)`, turn into construct call. const int argc = 1; Local<Value> argv[argc] = { args[0] }; Local<Function> cons = Local<Function>::New(isolate, constructor); args.GetReturnValue().Set(cons->NewInstance(argc, argv)); } }
void MyObject::PlusOne(const FunctionCallbackInfo<Value>& args) { Isolate* isolate = Isolate::GetCurrent(); HandleScope scope(isolate);
MyObject* obj = ObjectWrap::Unwrap<MyObject>(args.Holder()); obj->value_ += 1;
args.GetReturnValue().Set(Number::New(isolate, obj->value_)); } |
設置vs的debug命令和工做路徑。
調試開始後,會自動啓動node命令行。
能夠執行如下的命令查看效果。
若是在 VS 中打上斷點,能夠進行跟蹤。
將生成的myaddon2.node文件拷貝到node.js項目文件夾或者子文件夾下。
var myaddon2 = require("./addons/myaddon2") , nodeJsAddOncdObj;
app.post('/api/increase/:num', function (req, res){ if( !myobj ) myobj = new myaddon2.MyObject(req.params.num); res.format({ //HTML returns us back to the main page, or you can create a success page html: function(){ //only return json. }, //JSON returns the item with the message that is has been deleted json: function(){ res.json({ success:true, result : myobj.plusOne() }); } });
}); |