在Electron应用程序中使用node-firebird执行SELECT以外的任何操作时出错

问题描述 投票:0回答:3

我们必须重建一个从各种数据库导入数据的应用程序,并将它们插入到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 };
node.js async-await electron firebird async.js
3个回答
1
投票

因此,正如我评论的那样,它与Electron中的过程相关联。在渲染器过程中,它崩溃了。

我将数据库访问和操作移动到MAIN流程,它完美地运行。我现在使用渲染器和main之间的IPC通信。

谢谢大家 :)


0
投票

什么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


0
投票

我使用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 };

结果是一样的。

Here are the 3 "console.log" ouputs

© www.soinside.com 2019 - 2024. All rights reserved.