Nodejs hvalidator模块,c++提速node验证
Nodejs hvalidator模块,c++提速node验证
mark留用…snoopy大niubility…
为了更好地理解如何使用C++来加速Node.js中的验证过程,我们可以探讨一下如何利用node-addon-api
(N-API)来创建一个C++插件,该插件可以与JavaScript代码进行交互。我们将以hvalidator
为例,这是一个用于数据验证的库。通过将一些计算密集型的验证逻辑移到C++中,我们可以显著提高性能。
示例:创建一个简单的C++插件
首先,我们需要安装必要的工具和依赖项:
npm install node-gyp -g
然后,创建一个新的Node.js项目,并初始化它:
mkdir hvalidator-cpp
cd hvalidator-cpp
npm init -y
接下来,创建一个名为addon.cc
的文件,这是我们的C++源文件。在这个文件中,我们将定义一个简单的验证函数,并将其导出给Node.js使用。
addon.cc
#include <napi.h>
bool IsEven(int num) {
return num % 2 == 0;
}
Napi::Boolean IsEvenWrapped(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
if (info.Length() < 1 || !info[0].IsNumber()) {
Napi::TypeError::New(env, "Expected a number").ThrowAsJavaScriptException();
return Napi::Boolean::New(env, false);
}
int num = info[0].As<Napi::Number>().Int32Value();
return Napi::Boolean::New(env, IsEven(num));
}
Napi::Object InitAll(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, "isEven"), Napi::Function::New(env, IsEvenWrapped));
return exports;
}
NODE_API_MODULE(hvalidator_cpp, InitAll)
这个C++代码定义了一个简单的函数IsEven
,它检查一个整数是否为偶数。我们通过InitAll
函数将其暴露给Node.js。
构建C++插件
现在,我们需要编写一个binding.gyp
文件来描述我们的构建配置:
binding.gyp
{
"targets": [
{
"target_name": "hvalidator_cpp",
"sources": [ "addon.cc" ],
"include_dirs": ["<!@(node -p \"require('node-addon-api').include\")"],
"dependencies": ["<!(node -p \"require('node-addon-api').gyp\")"],
"cflags!": [ "-fno-exceptions" ],
"cflags_cc!": [ "-fno-exceptions" ],
"defines": [ "NAPI_DISABLE_CPP_EXCEPTIONS" ]
}
]
}
使用node-gyp
命令来构建插件:
node-gyp configure build
使用C++插件
最后,在Node.js中使用这个C++插件:
const addon = require('./build/Release/hvalidator_cpp');
console.log(addon.isEven(4)); // true
console.log(addon.isEven(5)); // false
通过这种方式,我们可以将计算密集型的验证逻辑移到C++中,从而提高Node.js应用的性能。
感谢捧场啊,可惜人气不旺啊,之前一篇也是你捧的场哇,谢谢啊
收藏了。人气不旺,是把你当神拜了。。仰望一下。
1024
不错不错,好玩
有这功夫,写个 Oracle Nodejs 驱动不好嘛,造福一下广大 Node-er
底层可以用 ocilib (http://www.ocilib.net),
过奖了啊,这个东西也是边学边写的
挺好玩的吧
c++ addon我也是刚学着写写,这oracle驱动实在搞不定啊
不是说这是C++模块么,在Windows下安装木有编译啊?
> require('hvalidator')
Error: Cannot find module '../addon/build/Release/verify.node'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at Object.<anonymous> (f:\github\node_modules\hvalidator\lib\verify.js:1:80)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:362:17)
我2了,忘记把编译加上去了
自己进去addon目录用node-gyp编译,提示木有regex.h文件
f:\github\node_modules\hvalidator\addon>node-gyp rebuild
gyp info it worked if it ends with ok
gyp info using node-gyp@0.7.2
gyp info using node@0.8.14 | win32 | ia32
gyp info spawn python
gyp info spawn args [ 'C:\\Users\\leizongmin\\.node-gyp\\0.8.14\\tools\\gyp\\gyp',
gyp info spawn args 'binding.gyp',
gyp info spawn args '-f',
gyp info spawn args 'msvs',
gyp info spawn args '-G',
gyp info spawn args 'msvs_version=2010',
gyp info spawn args '-I',
gyp info spawn args 'f:\\github\\node_modules\\hvalidator\\addon\\build\\config.gypi',
gyp info spawn args '-I',
gyp info spawn args 'C:\\Users\\leizongmin\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\addon.gypi',
gyp info spawn args '-I',
gyp info spawn args 'C:\\Users\\leizongmin\\.node-gyp\\0.8.14\\common.gypi',
gyp info spawn args '-Dlibrary=shared_library',
gyp info spawn args '-Dvisibility=default',
gyp info spawn args '-Dnode_root_dir=C:\\Users\\leizongmin\\.node-gyp\\0.8.14',
gyp info spawn args '-Dmodule_root_dir=f:\\github\\node_modules\\hvalidator\\addon',
gyp info spawn args '--depth=.',
gyp info spawn args '--generator-output',
gyp info spawn args 'f:\\github\\node_modules\\hvalidator\\addon\\build',
gyp info spawn args '-Goutput_dir=.' ]
gyp info spawn C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe
gyp info spawn args [ 'build/binding.sln',
gyp info spawn args '/clp:Verbosity=minimal',
gyp info spawn args '/nologo',
gyp info spawn args '/p:Configuration=Release;Platform=Win32' ]
SimpleVerify.cc
verify.cc
..\SimpleVerify.cc : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据
丢失 [f:\github\node_modules\hvalida
tor\addon\build\verify.vcxproj]
D:\Program Files\Microsoft Visual Studio 10.0\VC\include\xlocale(323): warning C4530: 使用了 C++ 异常处理程序,但未启用
展开语义。请指定 /EHsc
[f:\github\node_modules\hvalidator\addon\build\verify.vcxproj]
D:\Program Files\Microsoft Visual Studio 10.0\VC\include\xlocale(323): warning C4530: 使用了 C++ 异常处理程序,但未启用
展开语义。请指定 /EHsc
[f:\github\node_modules\hvalidator\addon\build\verify.vcxproj]
..\SimpleVerify.cc(6): fatal error C1083: 无法打开包括文件:“regex.h”: No such file or directory [f:\github\node_module
s\hvalida
tor\addon\build\verify.vcxproj]
C:\Users\leizongmin\.node-gyp\0.8.14\deps\v8\include\v8.h(183): warning C4506: 内联函数“v8::Persistent<T> v8::Persisten
t<T>
::New(v8::Handle<T>)”没有定义 [f:\github\node_modules\hvalidator\addon\build\verify.vcxproj]
with
[
T=v8::Object
]
gyp ERR! build error
gyp ERR! stack Error: `C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe` failed with exit code: 1
gyp ERR! stack at ChildProcess.onExit (C:\Users\leizongmin\AppData\Roaming\npm\node_modules\node-gyp\lib\build.js:23
2:23)
gyp ERR! stack at ChildProcess.EventEmitter.emit (events.js:99:17)
gyp ERR! stack at Process._handle.onexit (child_process.js:678:10)
gyp ERR! System Windows_NT 6.1.7601
gyp ERR! command "node" "C:\\Users\\leizongmin\\AppData\\Roaming\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuil
d"
gyp ERR! cwd f:\github\node_modules\hvalidator\addon
gyp ERR! node -v v0.8.14
gyp ERR! node-gyp -v v0.7.2
gyp ERR! not ok
这个regex.h是只有linux有的,还要去下个,我在vs2012下也没找到这个东西。现在已经加进去了,可以npm直接编译了,汗。。
HOHO~搞定了,windows下也支持了,尼玛跨平台真蛋疼
没关系,我C++也是菜鸟一只~
LZ很牛掰啊|!
根据你的要求,“Nodejs hvalidator模块,c++提速node验证”这个帖子的问题可能是在询问如何通过C++来加速Node.js中的hvalidator
模块的验证过程。这里提供一种可能的方法:使用Node.js的N-API
(原名Node-API
)或node-gyp
来创建一个C++扩展,该扩展可以用于优化验证逻辑。
示例代码:
首先,你需要安装必要的工具:
npm install -g node-gyp
sudo apt-get install g++
接下来,创建一个新的C++文件,例如validator.cc
,并在其中编写优化过的验证逻辑。以下是一个简单的例子:
#include <napi.h>
bool isNumberValid(double value) {
return (value >= 0 && value <= 100);
}
Napi::Boolean IsNumberValidWrapped(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
if (info.Length() < 1 || !info[0].IsNumber()) {
Napi::TypeError::New(env, "Number expected").ThrowAsJavaScriptException();
return Napi::Boolean::New(env, false);
}
double number = info[0].As<Napi::Number>().DoubleValue();
bool isValid = isNumberValid(number);
return Napi::Boolean::New(env, isValid);
}
Napi::Object Init(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, "isNumberValid"), Napi::Function::New(env, IsNumberValidWrapped));
return exports;
}
NODE_API_MODULE(addon, Init)
然后,创建一个binding.gyp
文件以配置编译过程:
{
"targets": [
{
"target_name": "validator",
"sources": [ "validator.cc" ]
}
]
}
运行编译命令:
node-gyp configure build
现在你可以使用这个C++扩展模块了。首先,在你的Node.js项目中添加对C++扩展的依赖,并导入它:
const validator = require('./build/Release/validator');
console.log(validator.isNumberValid(50)); // 输出: true
console.log(validator.isNumberValid(-1)); // 输出: false
这样就实现了使用C++来加速Node.js中某些特定功能(如数据验证)的目的。请注意,上述示例仅作演示用途,实际应用中需要根据具体需求调整验证逻辑。