【问题标题】:Node Electron Require issues with SQLAnywhere - Error: Could not load modulesSQLAnywhere 的 Node Electron Require 问题 - 错误:无法加载模块
【发布时间】:2017-11-29 20:26:43
【问题描述】:

我是 Electron 新手,在使用 sqlanywhere 包时遇到问题。

我正在做一个非常基本的测试,当 sqlanywhere 尝试加载其驱动程序时,它会立即抛出一个错误。请注意,在我让 Electron 参与此应用程序之前,这一切正常。

这是我的示例代码:

const sqlanywhere = require('sqlanywhere');
const url = require('url');
const path = require('path');
const { app, BrowserWindow, Menu, Tray, ipcMain } = require('electron');

let conn = sqlanywhere.createConnection();

var conn_params = {
    Host  : 'localhost:2638',
    UserId  : 'user',
    Password: 'password',
    ConnectionPool: 'YES(MaxCached=10)'
};


conn.connect(conn_params, function(err) {

  if (err) throw err;    

  conn.exec('SELECT * from mytable', function (err, result) {    
      if (err) throw err;  
      console.log(result[0]);      
      conn.disconnect();
  })
});



let mainWindow;

  app.on('ready', () => {

  console.log("Started...");

  // Create Window
  mainWindow = new BrowserWindow({
      width: 200,
      height: 200        
  });

  // Load HTML file into Window
  mainWindow.loadURL(url.format({
      pathname: path.join(__dirname, 'mainWindow.html'),
      protocol: 'file:',
      slashes: true
  }));     



});

抛出的错误是:

“未捕获的异常:错误:无法为平台加载模块:'win32',进程架构:'x64',和版本:'v7.9.0”

在我看来,Electron 处理 sqlanywhere 包中的“require”语句的方式导致了问题。 sqlanywhere的index.js是:

    // ***************************************************************************
    // Copyright (c) 2017 SAP SE or an SAP affiliate company. All rights reserved.
    // ***************************************************************************
    var db = null;
    var driver_file = "sqlanywhere"

    var v = process.version;
    var match = v.match( 'v([0-9]+)\.([0-9]+)\.[0-9]+' );
    driver_file += '_v' + match[1];
    if( match[1]+0 == 0 ) {
        driver_file += '_' + match[2];
    }

    try {
        if( process.arch == "x64" ) {
        db = require( "./../bin64/" + driver_file );

        } else if( process.arch == "ia32" ) {
        db = require( "./../bin32/" + driver_file );

        } else {
        throw new Error( "Platform Not Supported" );
        }
    } catch( err ) {
        try {
        // Try finding natively compiled binaries
        console.log("Error thrown"); // added by me
        console.log("DB: " + db);    // db is null
        db = require( "./../build/Release/sqlanywhere.node" ); 
        } catch( err ) {
        throw new Error( "Could not load modules for Platform: '" + 
                process.platform + "', Process Arch: '" + process.arch +
                "', and Version: '" + process.version +"'" ); 
        }
    }
    module.exports = db;

我添加了上面的两个console.log 语句来确认正在执行catch 块,并且此时db 仍然为空,此时它应该已加载x64 驱动程序。同样,这在涉及 Electron 之前一直有效。

看来 Electron 可能有问题

db = require( "./../bin64/" + driver_file );

如果有人能提供任何见解,我将永远感激不尽!

谢谢

【问题讨论】:

    标签: node.js electron sqlanywhere


    【解决方案1】:

    我假设您尝试加载的模块包含本机模块。原生模块需要 node.js 进程与编译的二进制文件之间的版本匹配,这意味着如果 node.js 版本在您的节点安装与 Electron 之间不匹配,模块将无法加载。您可以在这些特定版本之间进行匹配,或者使用https://github.com/electron/electron-rebuild 生成正确的二进制文件。

    【讨论】:

    • 谢谢,我可以使用 electron-rebuild 来解决这个问题
    猜你喜欢
    • 2022-05-28
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    相关资源
    最近更新 更多