我希望使用google v8引擎访问javascript到我的c ++函数,并根据我的javascript函数中的参数返回结果。
我的javascript功能如下:
var result = MyFc(
{
'stringData':'abc',
'numberData':123,
'arrData':[1,2,3],
'objData':{'a':true,'b':false,'c':true},
'callback':function(){}
}
);
我用过
global->Set(v8::String::New("myFc"), v8::FunctionTemplate::New(MyFc));
v8::Handle<v8::Value> MyFc(const v8::Arguments& args) {
obj = args[0]->...
if( obj->stringData != 'abc' ){
//....
}
if( obj->numberData != 123 ){
//....
}
if( obj->arrData[2] != 3 ){
//....
}
if( obj->objData->b == false ){
//....
}
if( obj->callback !='abc' ){
//....
}
}
我的问题是如何在c ++ v8中解析参数对象?我想访问参数中对象的所有键值,值可以是数字,字符串,数组,匿名函数或对象。
答案 0 :(得分:13)
使用v8::Value
(IsBoolean()
,IsArray()
,IsObject()
等)的类型检查方法,然后v8::Handle<T>::Cast(v8::Handle<S>)
将args[i]
值转换为相应的类型。
您的代码应如下所示:
if (args[0]->IsArray()) {
Handle<Array> array = Handle<Array>::Cast(arg[0]);
for (int i = 0; i < array->Length(); i++) {
//...
}
}
if (args[1]->IsObject()) {
Handle<Object> object = Handle<Object>::Cast(args[i]);
Handle<Value> fieldValue = object->Get(String::New("a"));
Handle<Value> callback = object->Get(String::New("callback"));
if (callback->IsFunction()) {
Handle<Function> fn = Handle<Function>::Cast(callback);
}
}
答案 1 :(得分:0)
注意:
此方法仅适用于Node JS版本0.8 。 截至8月19日, 2013 v8 juice project由于不兼容程度而被放弃 2013年上半年核心v8的变化。
致力于更新the code aponxi/npm-execxi以解释C ++中的JavaScript变量 不使用cvv8库。
这是我处理参数的方式。我希望这有助于某人!
完整脚本来自execxi.cpp aponxi/npm-execxi
注意:我正在使用v8::juice将JS转换为C ++
#include <node/node.h>
#include <v8.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstdio>
#include <cvv8/convert.hpp>
#include <iostream>
#include <string>
#include <sstream>
#include <set>
namespace cv = cvv8;
using namespace v8;
Handle<Value> executeArray(const Arguments& args) {
HandleScope scope;
// here I define default options in c++
// later we will parse options that come from js
// and convert values to C++ values, and replace
// these default options with the one provided
// for the sace of example I just copy pasted one
// option here:
// OPTIONS
/////////////////////
//
// Chained (bool)
// If a command doesn't exit with 0 then we won't run the next command
// default: true
bool Chained = true;
// there is code here that checks if first arguments is passed
// and handles that argument
// the second argument is options, as if
// "myfunction("arg1", {chained: false})"
// comes from javascript.
// This part below checks if there are two arguments
// since passing options is totally optional.
// we begin by checking if two arguments are passed:
if (args.Length() == 2)
{
if (args[1]->IsObject())
{
// you must be passing options...
// it must be an object
Handle<Object> opt = Handle<Object>::Cast(args[1]);
if (opt->Has(String::New("chained"))) {
// you passed chained option
if ((opt->Get(String::New("chained"))->IsBoolean())){
// the chained option must be bool
Handle<Value> _chained = opt->Get(String::New("chained"));
Chained = cv::CastFromJS<bool>(_chained);
} else {
// chained is not bool, throw error
ThrowException(Exception::TypeError(String::New("not bool")));
return scope.Close(Undefined());
}
}
}
}
}