N_API 如何将 int 值参数发送到 Napi::CallbackInfo
N_API How to send int value parameters to Napi::CallbackInfo
这是我的第一个 node.js 和 n_api。我一直在使用 PHP/APACHI。但是我的网络需要 c++ 库,我决定使用 n_api。
问题是 ajax 发送的值在 c++ 中始终为 0。
我不知道有什么问题。
例如)我使用 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++ 代码时,您最好 return 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");
}
这是我的第一个 node.js 和 n_api。我一直在使用 PHP/APACHI。但是我的网络需要 c++ 库,我决定使用 n_api。 问题是 ajax 发送的值在 c++ 中始终为 0。 我不知道有什么问题。 例如)我使用 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++ 代码时,您最好 return 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");
}