电子和sequelize错误:方言sqlite不支持

我试图在桌面应用程序中使用电子的 sequelize和sqlite,但通过npm start (运行node_modules/.bin/electron . )运行应用程序时,出现以下错误:

未捕获的错误:方言sqlite不支持。 (错误:请手动安装sqlite3包)

我用npm install --save sequelize sqlite安装了sequelize和sqlite npm install --save sequelize sqlite 。 当我通过node models.js直接运行模型文件时,一切工作正常:

 $ node models.js Executing (default): CREATE TABLE IF NOT EXISTS `Users` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `username` VARCHAR(255), `birthday` DATETIME, `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL); Executing (default): PRAGMA INDEX_LIST(`Users`) Executing (default): INSERT INTO `Users` (`id`,`username`,`birthday`,`updatedAt`,`createdAt`) VALUES (NULL,'janedoe','1980-07-19 22:00:00.000 +00:00','2015-09-06 11:18:52.412 +00:00','2015-09-06 11:18:52.412 +00:00'); { id: 1, username: 'janedoe', birthday: Sun Jul 20 1980 00:00:00 GMT+0200 (CEST), updatedAt: Sun Sep 06 2015 13:18:52 GMT+0200 (CEST), createdAt: Sun Sep 06 2015 13:18:52 GMT+0200 (CEST) } 

所以这个问题是特定于使用电子续集的。 所有文件如下所示。

的package.json

 { "name": "example", "version": "0.0.0", "description": "", "main": "app.js", "scripts": { "start": "node_modules/.bin/electron .", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "devDependencies": { "electron-prebuilt": "^0.31.1" }, "dependencies": { "jquery": "^2.1.4", "sequelize": "^3.7.1", "sqlite3": "^3.0.10" } } 

app.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() { mainWindow = new BrowserWindow({width: 800, height: 600}); mainWindow.loadUrl('file://' + __dirname + '/index.html'); mainWindow.on('closed', function() { mainWindow = null; }); }); 

的index.html

 <!DOCTYPE html> <html lang="en"> <head> <!-- Required meta tags always come first --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta http-equiv="x-ua-compatible" content="ie=edge"> </head> <body> <p>Example</p> <script src="models.js"></script> </body> </html> 

models.js

 var Sequelize = require('sequelize'); var sequelize = new Sequelize('bdgt', 'username', 'password', { dialect: 'sqlite', storage: 'example.db', }); var User = sequelize.define('User', { username: Sequelize.STRING, birthday: Sequelize.DATE }); sequelize.sync().then(function() { return User.create({ username: 'janedoe', birthday: new Date(1980, 6, 20) }); }).then(function(jane) { console.log(jane.get({ plain: true })); }); 

使用npm install来安装依赖关系,并使用npm start来重现问题。 运行node models.js将显示它自己的后续作品。

最后,我根据@Josh提供的文章以及其他博客post和问题讨论,find了解决这个问题的工作scheme。 下面我写了我为了解决这个问题而采取的所有步骤。 最终的解决scheme发布在这个答案底部

我遵循电子回购的电子教程。

简单的方法

我已经安装了electron-rebuild节点包并运行./node_modules/.bin/electron-rebuild给我以下错误:

 node-pre-gyp ERR! install error node-pre-gyp ERR! stack Error: Unsupported target version: 0.31.2 node-pre-gyp ERR! command "node" "/my/project/dir/node_modules/sqlite3/node_modules/.bin/node-pre-gyp" "install" "--fallback-to-build" node-pre-gyp ERR! not ok npm ERR! Failed at the sqlite3@3.0.10 install script 'node-pre-gyp install --fallback-to-build'. npm ERR! This is most likely a problem with the sqlite3 package, npm ERR! not with npm itself. npm ERR! Tell the author that this fails on your system: npm ERR! node-pre-gyp install --fallback-to-build 

节点gyp的方式

我已经在全局安装了node- ./node_modules/sqlite3模块,并input了./node_modules/sqlite3目录。 然后我试着运行下面的命令:

 node-gyp rebuild --target=0.31.2 --arch=x64 --dist-url=https://atom.io/download/atom-shell 

并得到以下错误:

 gyp: Undefined variable module_name in binding.gyp while trying to load binding.gyp 

npm方式

结果和The Easy Way一样。

sqlite3分叉

最后我试图下载sqlite3的几个叉子 。 不幸的是结果是一样的。

最后的尝试 – 解决scheme

@Josh提供的博客post对我来说是被禁止的,但是我发现它的谷歌caching版本。 我也跟着讨论了电子问题 。

下面介绍的步骤应该为你提供一个可用的sqlite3包。

  • 改变电子版本在你的package.json "electron-prebuilt": "0.29.1"
  • 重新安装electron-prebuilt
  • 将目录切换到./node_modules/sqlite3
  • 运行预发布脚本npm run prepublish
  • configurationnode-gyp module_name和module_path

     node-gyp configure --module_name=node_sqlite3 --module_path=../lib/binding/node-v44-linux-x64 
  • 重build包

     node-gyp rebuild --target=0.29.1 --arch=x64 --target_platform=linux --dist-url=https://atom.io/download/atom-shell --module_name=node_sqlite3 --module_path=../lib/binding/node-v44-linux-x64 

我试图使用电子预编译包的版本0.31.2进行编译,但由于某种原因失败了。

如果你使用macreplacedarvin linux

如果你的操作系统架构是32位用ia32replacex64

我知道你已经安装了sqlite3并单独工作,但是当你尝试与electron一起使用sqlite3时会出现问题。 这是因为ABI版本不匹配。

当你把一个

console.log(err);

<project>/node_modules/sequelize/lib/dialects/sqlite/connection-manager.js第21行,

只是之前throw new Error('Please install sqlite3 package manually'); 你会看到如下错误:

 { [Error: Cannot find module '<full_path_to_project>/node_modules/sqlite3/lib/binding/node-v44-linux-x64/node_sqlite3.node'] code: 'MODULE_NOT_FOUND' } 

但是,当你检查/node_modules/sqlite3/lib/binding/文件夹时,将不会有node-v44-linux-x64文件夹,但是像node-v11-linux-x64文件夹。 (只需重命名该文件夹将不起作用。)

这种不匹配的发生是因为电子在内部使用io.js v3.1.0因为它在这里指出它的ABI版本和你的nodejs版本不匹配。

请注意, node-vXX是通过节点的ABI版本决定的。 检查此url以获取更多信息: https : //github.com/mapbox/node-pre-gyp/issues/167

在这里说明的简单方法https://github.com/atom/electron/blob/master/docs/tutorial/using-native-node-modules.md#the-easy-way不工作是&#x4E0E;sqlite但您可以按照以下步骤使其工作:

通过以下命令安装electron-rebuild之后

 npm install --save-dev electron-rebuild 

请转至<project path>/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/abi_crosswalk.js并查找您的节点版本,然后将node_abi值更改为44 。 如下所示:

 "0.12.7": { "node_abi": 44, "v8": "3.28" }, 

然后给./node_modules/.bin/electron-rebuild命令并稍等一下。 然后它工作。

如果你可以运行$npm list sqlite3 ,你会得到一个像…

MyAppName@0.0.1 /path/to/MyApp └── sqlite3@3.0.10

那么问题可能是,sqlite3不工作在电子(没有一些胁迫)和Sequelize不知道如何expression错误。

看到这个博客文章,以获得在Electron工作的sqlite3。 这应该解决你的问题与Sequelize。

我遇到了这个错误很多次,对我来说这个解决scheme是安装electron-rebuild ,然后运行:

 electron-rebuild -w sqlite3 -p 

-p标志在这里是必需的,因为sqlite3使用node-pre-gyp。