N_API如何将int值参数发送到Napi::CallbackInfo



这是我的第一个node.js和n_api。我一直在使用PHP/APACHI。但我的网络需要c++库,我决定使用n_api。问题是ajax发送的值在c++中总是0。我不知道出了什么问题。ex(我使用vscode。

const testAddon = require('./build/Release/firstaddon.node');
var http = require('http');
var url = require('url');
var fs = require('fs');
const express = require('express');
const app = express();
bodyParser = require('body-parser');
var port = '1080';
app.use(bodyParser.json());         // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
extended: true
}));
app.post('/server', function(req, res){ 
var responseData = {};
responseData.pID = req.body.pID; 
console.log(responseData.pID);              <<============= here, value is correct.
const prevInstance = new testAddon.ClassExample(4.3);
var value = prevInstance.getFile(responseData.pID);   
console.log(value);
res.json(responseData);
});

如果ajax发送2,则出现console.log(responseData.pID(//2。这很正常。下面是classtest.cpp

Napi::Value ClassTest::GetFile(const Napi::CallbackInfo &info)
{
Napi::Env env = info.Env();
Napi::HandleScope scope(env);
using namespace std;
if (info.Length() != 1 || !info[0].IsNumber())
{
Napi::TypeError::New(env, "Number expected").ThrowAsJavaScriptException();
}   
Napi::Number file_id = info[0].As<Napi::Number>();
int num = this->actualClass_->openFile(file_id);                   <<== here, file id
return Napi::Number::New(info.Env(), num);
}

和ActualClass.cpp显示问题的文件。

int ActualClass::openFile(int id)
{
ifstream fin;  
cout << id << endl;                  <<============================ here, always '0'
filename += to_string(id) += ".txt";
fin.open(filename.c_str(), ios_base::in | ios_base::binary);
if (fin.is_open())
{
while (fin.read((char *)&sdo, sizeof(sdo)))
{
cout << setw(20) << sdo.name << ":"
<< setprecision(0) << setw(12) << sdo.width
<< setprecision(2) << setw(6) << sdo.height
<< setprecision(4) << setw(6) << sdo.size << endl;
slist.push_back(sdo);
}
fin.close();       
}
else if (!fin.is_open())
{
cerr << "can't open file " << filename << ".n";
exit(EXIT_FAILURE);
}
return sdo.size;
}

只准备了文件1到4。但是,进入函数的参数值始终为0。结果是";无法打开文件0.txt;。我该如何解决?

Napi::Number file_id = info[0].As<Napi::Number>();

我知道这里它被转换成一个可以由C++处理的int值。还有什么我不知道的吗?感谢阅读。

您需要在Napi::Number::Int32Value调用的帮助下将其强制转换为数字。(对于较大的数字,也可以使用Napi::Number::Int64Value(试试这个。

int file_id = info[0].ToNumber().Int32Value();

同样与这个问题无关,但值得一提的是,当您在执行ThrowAsJavaScriptException()时,实际的C++代码会继续执行,您最好返回undefined以避免严重的错误。

if (info.Length() != 1 || !info[0].IsNumber())
{
Napi::TypeError::New(env, "Number expected").ThrowAsJavaScriptException();
return Env.Undefined();
} 

一个更干净的方法是启用CPP异常,并将错误丢弃在那个位置。

if (info.Length() != 1 || !info[0].IsNumber())
{
throw Napi::TypeError::New(env, "Number expected");
}

相关内容

  • 没有找到相关文章

最新更新