我们必须重建一个从各种数据库导入数据的应用程序,并将它们插入到Firebird 3(带有node-firebird)的数据库中。
使用Express在NodeJS项目中运行时,它运行正常。
现在,我正在编写一个POC,将代码嵌入到Electron应用程序中。
每次我尝试做除SELECT之外的任何事情,应用程序崩溃。
这是消息:
Error
at doCallback (index.js:1234)
at index.js:2929
at messages.js:126
at FSReqWrap.oncomplete (fs.js:141)
我没有任何其他消息。
我们正在使用Electron 4.0.5,Node 10,Firebird 3.0.4(32位)Node-firebird
我们也试过:node-firebird-dev但没有成功
这是一个简单的代码示例(使用“manukdadali”,node-firebird上的异步包装器)。
const firebird = require('manukdadali');
const path = require('path');
const moment = require('moment');
class TestDB {
constructor(folder) {
this.options = {
host: 'localhost',
database: path.resolve(folder),
user: 'SYSDBA',
password: 'masterkey',
};
}
insertData = async () => {
const db = await firebird.connect(this.options);
let rows = await db.query('select * from t_client');
console.log(rows);
try {
rows = await db.query(
`insert into t_client
(t_client_id,
matricule,
nom,
prenom,
nom_jeune_fille,
date_naissance,
rang_gemellaire,
langue,
sexe,
maison,
etage,
chambre,
lit,
commentaire_individuel,
commentaire_global,
t_profil_remise_id,
t_personne_referente_id,
facturation,
date_derniere_visite
) values (
4,
'000233532',
'NAME',
'NAME2',
'NAME3',
'19700504',
1,
'FR',
'M',
'',
'',
'',
'',
'',
'',
1,
1,
'1',
''
)`);
} catch (error) {
console.log(error);
}
};
}
export { TestDB };
因此,正如我评论的那样,它与Electron中的过程相关联。在渲染器过程中,它崩溃了。
我将数据库访问和操作移动到MAIN流程,它完美地运行。我现在使用渲染器和main之间的IPC通信。
谢谢大家 :)
什么rowset
期望来自插入声明?什么是返回,更多的是,insert
可以有多行结果?
rows = await db.query(
`insert into t_client ....
只要看一下Node-firebird
描述 - 拉结果行发布INSERT
的方法?
这是从那里的例子 - 它不使用行:
// db = DATABASE
db.query('INSERT INTO USERS (ID, ALIAS, CREATED) VALUES(?, ?, ?) RETURNING ID', [1, 'Pe\'ter', new Date()],
function(err, result) {
console.log(result[0].id);
db.query('SELECT * FROM USERS WHERE Alias=?', ['Peter'], function(err, result) {
console.log(result);
db.detach();
有关Node Firebird
库的完整概述,请使用内置测试模块 - 它突出显示了访问数据库的所有预期方法以及所有典型错误。
https://github.com/hgourvest/node-firebird/tree/master/test
下一个罪魁祸首可能是await
修饰符。
根据https://ponyfoo.com/articles/understanding-javascript-async-await
请注意,await只能用于标有
async
关键字的函数。它与发生器的工作方式类似,在您的上下文中暂停执行,直到承诺结算
功能是否标记?
https://github.com/hgourvest/node-firebird/blob/master/lib/index.js
Transaction.prototype.query = function(query, params, callback) {
那么,它是用async
标记的,这个函数是用悬浮容忍的Promise
返回方式写的吗?不是吗使用async
标志写的Firebird-Node库中是否还有其他功能?我找不到任何东西。
这应该意味着如果你想在async-await off-side模式中使用一些Firebird-Node代码,你必须制作你自己的async
感知函数,并在这些函数中以通常的非async
模式调用数据库函数,并且只传递你的特殊功能async
-ready包装到await
。
我使用ONLY node-firebird重写代码......
const firebird = require('node-firebird');
const path = require('path');
const moment = require('moment');
class TestDB {
constructor(folder) {
this.options = {
host: 'localhost',
database: path.resolve(folder),
user: 'SYSDBA',
password: 'masterkey',
port: 3050,
lowercase_keys: false,
role: null,
pageSize: 4096,
};
}
getGlients = async () => {
return new Promise((resolve, reject)=> {
this.db.query('select * from t_client', (err, res) => {
resolve(res);
})
})
};
connectDb = async () => {
return new Promise((resolve, reject) => {
firebird.attach(this.options, (err,db) => {
resolve(db)
});
});
};
insertData = async() => {
return new Promise((resolve, reject) => {
this.db.execute(
`insert into t_client
(t_client_id,
matricule,
nom,
prenom,
nom_jeune_fille,
date_naissance,
rang_gemellaire,
langue,
sexe,
maison,
etage,
chambre,
lit,
commentaire_individuel,
commentaire_global,
t_profil_remise_id,
t_personne_referente_id,
facturation,
date_derniere_visite
) values (
4,
'000233532',
'NAME',
'NAME2',
'NAME3',
'19700504',
1,
'FR',
'M',
'',
'',
'',
'',
'',
'',
1,
1,
'1',
''
)`
, (err, res) => {
if (err) reject(err);
resolve(res);
});
})
}
launchTest = async () => {
this.db = await this.connectDb();
console.log(this.db)
let rows = await this.getGlients();
console.log(rows);
try {
const res = await this.insertData();
console.log(res);
} catch (error) {
console.log(error);
}
};
}
export { TestDB };
结果是一样的。