【问题标题】:How to use sqlite3 module with electron?如何将 sqlite3 模块与电子一起使用?
【发布时间】:2015-12-06 21:12:54
【问题描述】:

我想使用electron 开发桌面应用程序,该应用程序使用通过 npm 安装的 sqlite3 包和命令

npm install --save sqlite3

但它在电子浏览器控制台中出现以下错误

Uncaught Error: Cannot find module 'E:\allcode\eapp\node_modules\sqlite3\lib\binding\node-v45-win32-x64\node_sqlite3.node'

我的开发环境是windows 8.1 x64 节点版本 12.7

我的 package.json 文件如下所示:

{
  "name": "eapp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "electron ."
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "electron-prebuilt": "^0.32.1"
  },
  "dependencies": {
    "angular": "^1.3.5",   
    "sqlite3": "^3.1.0"
  }
}

index.js 文件

var app = require('app');
var BrowserWindow = require('browser-window'); 
require('crash-reporter').start();
var mainWindow = null;


app.on('window-all-closed', function() {  
    if (process.platform != 'darwin') {
        app.quit();
    }
});

app.on('ready', function() {
    // Create the browser window.
    mainWindow = new BrowserWindow({width: 800, height: 600}); 
    mainWindow.loadUrl('file://' + __dirname + '/index.html');   
    mainWindow.openDevTools();  
    mainWindow.on('closed', function() {       
        mainWindow = null;
    });
});

my.js 文件

var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('mydb.db');

db.serialize(function() {
    db.run("CREATE TABLE if not exists lorem (info TEXT)");

    var stmt = db.prepare("INSERT INTO lorem VALUES (?)");
    for (var i = 0; i < 10; i++) {
        stmt.run("Ipsum " + i);
    }
    stmt.finalize();

    db.each("SELECT rowid AS id, info FROM lorem", function(err, row) {
        console.log(row.id + ": " + row.info);
    });
});

db.close();

index.html 文件

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<div >
    <div>
        <h2>Hello</h2>
    </div>

</div>
<!--<script src="js/jquery-1.11.3.min.js"></script>-->
<script src="js/my.js"></script>
</body>
</html>

【问题讨论】:

    标签: node.js sqlite npm electron


    【解决方案1】:

    这里要考虑两个方面:

    1. 设置NODE_PATH:这让electron知道在哪里可以找到你的模块(详细解释请参阅this answer
    2. 针对电子头编译本机模块:见官方docs

    并检查以下问题,它们会问同样的问题:


    我的建议是试试lovefield(由 Google 提供)。

    【讨论】:

    • 在 Nodewebkit 中,我必须编译 sqlite。同样的规则也适用于电子?
    • @Wexoni AFAIK 每个具有本机绑定的节点模块都必须针对电子标头进行编译。
    • @Wexoni 我没有使用过 NW,但我知道 sqlite3 必须先编译才能在电子中使用它。我是否正确理解了您的问题?
    • @YannBertrand 他们仍然使用自己的标题。所以我想你仍然需要根据他们的标题编译它。
    • 感谢您的小费洛夫菲尔德。这真是一个很棒的图书馆。
    【解决方案2】:

    一个更简单的解决方案:

    1. 安装电子重建npm i electron-rebuild --save-dev
    2. 启动电子重建 ./node_modules/.bin/electron-rebuild(或在 Windows 上 .\node_modules\.bin\electron-rebuild.cmd
    3. 转到“node_modules/sqlite3/lib/binding/”并将文件夹“electron-v0.36-darwin-x64”重命名为“node -v47-darwin-x64"

    PS:v47是我的版本,小心选择好的版本(在你的情况下v45

    【讨论】:

    • 第三步能解释一下吗?为什么要重命名?
    【解决方案3】:

    看看类似的答案here

    TL;DR

    cd .\node_modules\sqlite3
    npm install nan --save
    npm run prepublish
    node-gyp configure --module_name=node_sqlite3 --module_path=../lib/binding/electron-v1.3-win32-x64
    node-gyp rebuild --target=1.3.2 --arch=x64 --target_platform=win32 --dist-url=http://electron.atom.io/ --module_name=node_sqlite3 --module_path=../lib/binding/electron-v1.3-win32-x64
    

    【讨论】:

    • 脚本prepublish 是什么样的?
    • 链接的类似答案是 404
    【解决方案4】:

    我遇到了同样的问题。尝试了一切,最后这对我有用:-

    npm install --save sqlite3
    npm install --save electron-rebuild
    npm install --save electron-prebuilt
    .\node_modules\.bin\electron-rebuild.cmd
    

    这将在电子使用 sqlite3 的 .\node_modules\sqlite3\lib\binding\ 位置创建“electron-v1.3-win32-x64”文件夹。

    只需启动应用程序,您现在就可以使用 sqlite3 了。

    【讨论】:

    【解决方案5】:

    我不推荐本地节点 sqlite3 模块。它需要重建才能使用电子。这是一个巨大的痛苦 - 至少我永远无法让它工作并且他们没有关于在 Windows 上重建模块的说明。

    看看 kripken 的 'sql.js' 模块,它是 100% 用 Ja​​vaScript 编译的 sqlite3。 https://github.com/kripken/sql.js/

    【讨论】:

    • Electron 文档非常清楚,为了使用捆绑的本机模块,您需要重新构建它们才能使用电子。要么使用大多数时间都可以使用的 electron-rebuild 实用程序,要么手动设置 gyp 标志:electron.atom.io/docs/tutorial/using-native-node-modules
    • 抱歉回复慢。 github.com/electron/electron-rebuild 是用于在开发中重建的便捷工具。 github.com/electron-userland/electron-builder/wiki/… 描述了用于生产构建的多平台构建策略。请记住,一旦你引入了原生 deps,你就失去了为不同操作系统交叉编译的能力。 github.com/nodejs/node-gyp#installation 在必要的 Windows 编译器工具上有不错的文档。
    • 这些 cmets 都与此答案无关!
    • 需要说明的是sql.js不能对文件系统进行操作。每次需要更改数据库时,都必须将整个内容写入磁盘。在大多数情况下,它几乎毫无用处。
    • sql.js 更像是一个玩具,是为了好玩。它不能比 NeDB 和其他 nosql 数据库更好,因为它将所有数据库都存储在内存中。所以没有充分的理由使用它。对于小型数据库使用像 NeDB 这样的 nosql,对于更大的你必须编译 sqlite
    【解决方案6】:

    到目前为止,将 SQLite 与电子结合使用的最简单方法是使用 electron-builder

    首先,在你的 package.json 中添加一个 postinstall 步骤:

    "scripts": {
       "postinstall": "install-app-deps"
       ...
    }
    

    然后安装必要的依赖并构建:

    npm install --save-dev electron-builder
    npm install --save sqlite3
    npm run postinstall
    

    electron-builder 将为您的平台构建本机模块,并为 Electron 绑定使用正确的名称;然后你可以像往常一样在代码中require它。

    请看我的 github repoblog post - 我也花了很长时间才弄明白。

    【讨论】:

    • 使用electron-boilerplate-sqlite确实是更简单的方法,但使用npm install
    • 当运行 'npm run postinstall' 时,我收到此错误“一次构建此解决方案中的项目。要启用并行构建,请添加“/m”开关。”
    • 这已经救了我的隐藏不是一次,而是两次!
    • 将 sqlite3 与电子应用程序一起使用的最简单方法是在此处遵循 sqlite3 文档:npmjs.com/package/sqlite3#custom-builds-and-electron。在电子 8.3.0 上为我工作,无需重建。我只是让 Sailab Rahi 的回答更加引人注目。
    • 不应该是"postinstall": "electron-builder install-app-deps"吗?
    【解决方案7】:

    我也遇到了这个错误。这是我解决它的方法: npm install --save-dev electron-rebuild 然后: ./node_modules/.bin/electron-rebuild

    来自:https://electronjs.org/docs/tutorial/using-native-node-modules

    ps:在重建过程中,请勿使用npm start启动电子应用程序。否则重建过程将失败。

    【讨论】:

      【解决方案8】:

      它适用于我的版本 3 和 4,不幸的是版本 5 不适用。有关详细信息,请参阅 sqlite3 文档:https://www.npmjs.com/package/sqlite3#custom-builds-and-electron 或以其他方式运行以下行:npm install sqlite3 --runtime=electron --target=4.0.0 --dist-url=https://atom.io/download/electron

      【讨论】:

      • 这是我使用 sqlite3 和 electron8.3.0 的问题,它可以工作,谢谢。
      【解决方案9】:

      您可以使用 Visual Studio 手动构建本机模块。

      1. 下载Visual Studio 2019。
      2. 安装包“使用 c++ 进行桌面开发”。在安装详细信息选项卡中选择 “MSVC v140 - VS 2015 C++ 构建工具 (v14.00)”
      3. 在您的项目中下载 electron-builder。
      4. 在 package.json 中创建一个脚本。 “脚本”:{ “安装后”:“安装-应用程序-deps” }

      5. 然后运行脚本。

      【讨论】:

        【解决方案10】:
        npm install --save sqlite3
        npm install --save-dev electron-rebuild
        

        然后,在你的 package.json 的脚本中,添加这一行:

        "scripts": {
          "postinstall": "electron-rebuild",
          ...
        },
        

        然后只需重新安装即可触发后安装:

        npm install
        

        在涉及电子构建器、电子网络包和续集的复杂用例中对我来说完美无缺。

        它可以在 electron-webpack 的开发模式和 Windows 和 Linux 的生产模式下工作。

        【讨论】:

          猜你喜欢
          • 2017-10-25
          • 2021-12-24
          • 2016-10-09
          • 2021-12-17
          • 2020-01-14
          • 2014-02-24
          • 2019-06-17
          • 2019-07-15
          • 1970-01-01
          相关资源
          最近更新 更多