我们必须重建一个从各种数据库导入数据的应用程序,并将它们插入到我们的数据库中,在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,但没有成功
这是一个简单的代码示例(使用node-firebird上的异步包装器"manukdadali“)。
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 };发布于 2019-03-29 17:40:17
因此,正如我所评论的,它与Electron中的过程相关联。在rederer进程中,它崩溃了。
我将数据库访问和操作转移到了主进程,它工作得很好。目前,我在渲染器和main之间使用IPC通信。
感谢所有人:)
发布于 2019-03-28 16:32:57
rowset期望从insert语句中得到什么?有什么可以返回的,更重要的是,从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的说法
请注意,在用
async关键字标记的函数中只能使用。它的工作原理类似于生成器,挂起上下文中的执行,直到promise稳定下来
是否标记了该函数?
https://github.com/hgourvest/node-firebird/blob/master/lib/index.js
Transaction.prototype.query = function(query, params, callback) {那么,它是用async标记的吗,这个函数是用容忍挂起的Promise-returning方式编写的吗?不是吗。在Firebird-Node库中有没有用async标志写的其他函数?我什么也找不到。
这意味着如果你想在异步等待模式下使用一些火鸟节点代码,你必须创建你自己的async-aware函数,并在这些函数中以通常的非async模式调用数据库函数,并且只将你特殊的async-ready包装器传递给await。
发布于 2019-03-28 18:50:36
我重写了代码,只使用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 };结果是一样的。

https://stackoverflow.com/questions/55382083
复制相似问题