v8 c ++ - 如何获取作为参数提供的对象键值

xha*_*lix 4 c++ v8 object node.js

我正在将js对象传递给我的函数

myFunc.do({'1':2});
Run Code Online (Sandbox Code Playgroud)

我希望std::cout在c ++中使用我的对象中的那些键值对

这就是我所拥有的

Handle<Object> object = Handle<Object>::Cast(args[i]);
Local<Array> objArray = object->GetPropertyNames();

 for(uint o=0; o < objArray->Length(); o++) {
   Local<Value> val = objArray->Get(o);
   v8::String::Utf8Value str(val->ToString());
   std::string foo = std::string(*str);    
   std::cout << "val is= " << foo;
 }
return;
Run Code Online (Sandbox Code Playgroud)

我做错了object->GetPropertyNames();,因为它没有让我获得传递的值

更新 这是另一个无用的尝试

Local<Context> context = isolate->GetCurrentContext();
Local<Object> object = Local<Object>::Cast(args[i]);
Local<Array> props;
if (!object->GetOwnPropertyNames(context).ToLocal(&props)) {
  std::cout << "Error";
  return;
}

for (uint32_t p = 0; p < props->Length(); ++p) {
  Local<Value> name;
  Local<Value> property_value;
  props->Get(context, p).ToLocal(&name);
  v8::String::Utf8Value str(name->ToString());
  std::string foo = std::string(*str);    
  std::cout << "val is= " << foo; // outputs 0
}
Run Code Online (Sandbox Code Playgroud)

感谢帮助

Mar*_*rcs 8

在节点7上测试的可验证示例也应该在6和4上工作,对于其他版本的节点,您可能需要使用nan:

// logger.cc
#include <string>
#include <iostream>
#include <node.h>

namespace demo {

using v8::Context;
using v8::Function;
using v8::FunctionCallbackInfo;
using v8::FunctionTemplate;
using v8::Isolate;
using v8::Local;
using v8::Number;
using v8::Object;
using v8::Persistent;
using v8::String;
using v8::Value;
using v8::Array;
using v8::Exception;

// Logging function for objects
void Log(const FunctionCallbackInfo<Value>& args) {
  Isolate* isolate = args.GetIsolate();

  if(args.Length() < 1 || !args[0]->IsObject()) {
    isolate->ThrowException(Exception::TypeError(
    String::NewFromUtf8(isolate, "Error: One object expected")));
    return;
  }

  Local<Context> context = isolate->GetCurrentContext();
  Local<Object> obj = args[0]->ToObject(context).ToLocalChecked();
  Local<Array> props = obj->GetOwnPropertyNames(context).ToLocalChecked();

  for(int i = 0, l = props->Length(); i < l; i++) {
    Local<Value> localKey = props->Get(i);
    Local<Value> localVal = obj->Get(context, localKey).ToLocalChecked();
    std::string key = *String::Utf8Value(localKey);
    std::string val = *String::Utf8Value(localVal);
    std::cout << key << ":" << val << std::endl;
  }
}

void CreateFunction(const FunctionCallbackInfo<Value>& args) {
  Isolate* isolate = args.GetIsolate();

  Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, Log);
  Local<Function> fn = tpl->GetFunction();

  // omit this to make it anonymous
  fn->SetName(String::NewFromUtf8(isolate, "loggerFunction"));

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

void Init(Local<Object> exports, Local<Object> module) {
  NODE_SET_METHOD(module, "exports", CreateFunction);
}

NODE_MODULE(logger, Init)

}  // namespace demo
Run Code Online (Sandbox Code Playgroud)

绑定:

{
  "targets": [
    {
      "target_name": "logger",
      "sources": [
        "logger.cc"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

测试:

const logger = require('./build/Release/logger');
var log = logger();

log({'Cave' :'Johnson'});
log({'1':2});
log({a: 1});
Run Code Online (Sandbox Code Playgroud)

输出:

Cave:Johnson
1:2
a:1
Run Code Online (Sandbox Code Playgroud)