Ошибка при выполнении чего-либо кроме SELECT с помощью node-firebird в приложении Electron - PullRequest
0 голосов
/ 27 марта 2019

Нам нужно пересобрать приложение, которое импортирует данные из разных БД и вставляет их в нашу БД в Firebird 3 (с node-firebird).

При работе в проекте NodeJS с Express все работало нормально.

Теперь я пишу 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-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 };

Ответы [ 3 ]

1 голос
/ 29 марта 2019

Итак, как я прокомментировал, это было связано с процессами в Electron. В процессе проверки он вылетал.

Я перенес доступ к БД и операции в ГЛАВНЫЙ процесс, и он работает отлично. Сейчас я использую связь IPC между рендерером и основным.

Спасибо всем:)

0 голосов
/ 28 марта 2019

Я переписываю код, используя ТОЛЬКО 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

0 голосов
/ 28 марта 2019

Что 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

Обратите внимание, что в функциях можно использовать только отмечен ключевым словом async.Он работает аналогично генераторам, приостанавливая выполнение в вашем контексте, пока не будет выполнено обещание

Была ли функция помечена?

https://github.com/hgourvest/node-firebird/blob/master/lib/index.js

Transaction.prototype.query = function(query, params, callback) {

Итак, былоона помечена async, написана ли эта функция устойчивой к приостановке Promise -возвратным способом?это не.Есть ли какая-нибудь другая функция в библиотеке Firebird-Node, написанная с флагом async?Я не смог найти ни одного.

Это должно означать, что если вы хотите использовать некоторый код Firebird-Node в автономном режиме async-await, вы должны сделать свои собственные async -защищенные функции и вызывать функции базы данных вОбычный не async режим внутри этих функций, и только передавайте свои специальные async -ухожные оболочки в await.

...