在使用mongoose时,传递的往往是一个对象,如

mongoose.Schema({
    seller: {type: mongoose.Schema.Types.ObjectId, ref: "UserModel"},
})

是如何实现这样的方式的呢,在前面的示例中,并没有提及。本文针对该问题,给出一个具体的示例。主要问题有如下两个:

  • 如何C++返回JSON格式的对象
  • 关于C++获取参数中的JSON对象 第一个问题在Stack Overfalow中已有提示,根据该提示,才有了该文。至于如何应用到实践,读取可以思考思考。 —— v8是javascript的实现的头文件,其中Object符合JS中Object的定义(即键值对序列)。查看v8文档的API是,可以看到set和get方法。 首先由一个示例:
#include <node/node.h>
#include <node/v8.h>

    using v8::FunctionCallbackInfo;
    using v8::Isolate;
    using v8::Local;
    using v8::Object;
    using v8::String;
    using v8::Value;

    void Method(const FunctionCallbackInfo<Value>& args) {
        Isolate* isolate = args.GetIsolate();
        Local<Object> arg_obj = Local<Object>::Cast(args[0]);
        Local<Value> str = arg_obj->Get(String::NewFromUtf8(isolate,"name"));

        Local<Object> fool = Object::New(isolate);
        if(str->IsString())
            fool->Set (String::NewFromUtf8 (isolate,"name"),str->ToString() );
        else
        fool->Set (String::NewFromUtf8 (isolate,"name"),String::NewFromUtf8(isolate,"gods") );
        fool->Set (String::NewFromUtf8 (isolate,"age"), v8::Integer::New(isolate,21));
        fool->Set (String::NewFromUtf8 (isolate,"jobs"), v8::Array::New (isolate));
        //关键方法,在键下创建一个 对象为值
        Local<Object> jobs = fool->Get (String::NewFromUtf8 (isolate,"jobs"))->ToObject ();
        jobs->Set (0, String::NewFromUtf8 (isolate,"SEU"));
        jobs->Set (1, String::NewFromUtf8 (isolate,"Taobao"));

        args.GetReturnValue().Set(fool);
    }

    void Init(Local<Object> module) {
        NODE_SET_METHOD(module, "tojson", Method);
    }

    NODE_MODULE(binding, Init)
//test.js
var obj_json = require('./build/Release/test.node');

console.log(obj_json.tojson({"name":"goodmorning"}));
/***
{ name: 'goodmorning', age: 21, jobs: [ 'SEU', 'Taobao' ] }
***/

待续:

  • [ ] 寻找一个适当的项目来开发Addons,一直没有合适的。同学们,有什么建议么?

作者 @flyfishonline 2016 年 07月 2日