首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Electron应用程序中使用node-firebird执行除SELECT之外的任何操作时出错

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

Stack Overflow用户
提问于 2019-03-28 00:25:08
回答 3查看 756关注 0票数 0

我们必须重建一个从各种数据库导入数据的应用程序,并将它们插入到我们的数据库中,在Firebird 3中(使用node-firebird)。

当使用Express在NodeJS项目中运行时,它工作得很好。

现在,我正在编写一个POC,以便将代码嵌入到Electron应用程序中。

每次我尝试执行除SELECT之外的任何操作时,应用程序都会崩溃。

下面是信息:

代码语言:javascript
复制
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“)。

代码语言:javascript
复制
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 };
EN

回答 3

Stack Overflow用户

发布于 2019-03-29 17:40:17

因此,正如我所评论的,它与Electron中的过程相关联。在rederer进程中,它崩溃了。

我将数据库访问和操作转移到了主进程,它工作得很好。目前,我在渲染器和main之间使用IPC通信。

感谢所有人:)

票数 1
EN

Stack Overflow用户

发布于 2019-03-28 16:32:57

rowset期望从insert语句中得到什么?有什么可以返回的,更重要的是,从insert可以返回哪些多行结果?

代码语言:javascript
复制
 rows = await db.query(
    `insert into t_client ....

看看Node-firebird的描述-拉取结果行是发出INSERT的一种方式吗?

下面是来自那里的示例-它不使用行:

代码语言:javascript
复制
// 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

代码语言:javascript
复制
Transaction.prototype.query = function(query, params, callback) {

那么,它是用async标记的吗,这个函数是用容忍挂起的Promise-returning方式编写的吗?不是吗。在Firebird-Node库中有没有用async标志写的其他函数?我什么也找不到。

这意味着如果你想在异步等待模式下使用一些火鸟节点代码,你必须创建你自己的async-aware函数,并在这些函数中以通常的非async模式调用数据库函数,并且只将你特殊的async-ready包装器传递给await

票数 0
EN

Stack Overflow用户

发布于 2019-03-28 18:50:36

我重写了代码,只使用node-firebird ......

代码语言:javascript
复制
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 };

结果是一样的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55382083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档