จะใช้โมดูล sqlite3 กับอิเล็กตรอนได้อย่างไร?


91

ฉันต้องการพัฒนาแอพเดสก์ท็อปโดยใช้อิเล็กตรอนที่ใช้แพ็คเกจ sqlite3 ที่ติดตั้งผ่าน npm ด้วยคำสั่ง

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 node เวอร์ชัน 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>

คำตอบ:


126

ไกลโดยวิธีที่ง่ายที่สุดที่จะใช้ SQLite electron-builderกับอิเล็กตรอนอยู่กับ

ขั้นแรกให้เพิ่มขั้นตอน postinstall ใน package.json ของคุณ:

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

จากนั้นติดตั้งการอ้างอิงที่จำเป็นและสร้าง:

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

ผู้สร้างอิเล็กตรอนจะสร้างโมดูลดั้งเดิมสำหรับแพลตฟอร์มของคุณด้วยชื่อที่ถูกต้องสำหรับการผูกอิเล็กตรอน จากนั้นคุณสามารถrequireใช้รหัสได้ตามปกติ

ดูrepo githubและบล็อกโพสต์ของฉัน - ฉันใช้เวลาพอสมควรในการคิดออกเช่นกัน


1
การใช้electron-boilerplate-sqliteเป็นวิธีที่ง่ายกว่า แต่ด้วยnpm install
Bernardo Ramos

1
เมื่อเรียกใช้ 'npm run postinstall' ฉันได้รับข้อผิดพลาดนี้ "การสร้างโครงการในโซลูชันนี้ทีละโครงการหากต้องการเปิดใช้งานการสร้างแบบขนานโปรดเพิ่มสวิตช์" / m "
chirag

สิ่งนี้ไม่ได้ช่วยที่ซ่อนของฉันเลยสักครั้ง แต่ถึงสองครั้ง!
John Nesbitt

ไม่มีใครรู้ว่า--save sqlite3ตัวเลือกสามารถติดแท็กในบรรทัดแรก (ด้วย--save-dev electron-builder) ได้อย่างน่าเชื่อถือซึ่งnpm installจะรันเพียงครั้งเดียวได้ที่ไหน?
Phillip

สิ่งนี้ไม่ได้ผลสำหรับฉันฉันได้รับข้อผิดพลาดเช่น "../../nan/nan_object_wrap.h:67:18: error: 'class Nan :: Persistent <v8 :: Object>' ไม่มีสมาชิกชื่อ 'MarkIndependent' `
Michael

21

ฉันไม่แนะนำให้ใช้โมดูล sqlite3 โหนดดั้งเดิม ต้องมีการสร้างใหม่เพื่อทำงานกับอิเล็กตรอน นี่เป็นความเจ็บปวดอย่างมากที่ต้องทำ - อย่างน้อยฉันก็ไม่สามารถใช้งานได้และไม่มีคำแนะนำในการสร้างโมดูลใหม่บน windows

ลองดูที่โมดูล 'sql.js' ของ kripken แทนซึ่งเป็น sqlite3 ที่คอมไพล์ 100% ใน JavaScript https://github.com/kripken/sql.js/


3
เอกสารอิเล็กตรอนค่อนข้างชัดเจนว่าในการใช้โมดูลเนทีฟแบบรวมคุณจะต้องสร้างขึ้นใหม่เพื่อให้ทำงานกับอิเล็กตรอนได้ ใช้ยูทิลิตี้สร้างอิเล็กตรอนใหม่ซึ่งใช้งานได้เกือบตลอดเวลาหรือตั้งค่าสถานะ gyp ด้วยตนเอง: electron.atom.io/docs/tutorial/using-native-node-modules
Bret

1
ขออภัยที่ตอบช้า github.com/electron/electron-rebuildเป็นเครื่องมือที่มีประโยชน์สำหรับการสร้างใหม่ในการพัฒนา github.com/electron-userland/electron-builder/wiki/…อธิบายถึงกลยุทธ์การสร้างแบบหลายแพลตฟอร์มสำหรับบิลด์การผลิต จำไว้ว่าเมื่อคุณแนะนำเดปพื้นเมืองคุณจะสูญเสียความสามารถในการคอมไพล์ข้ามสำหรับระบบปฏิบัติการต่างๆ github.com/nodejs/node-gyp#installationมีเอกสารที่ดีเกี่ยวกับเครื่องมือคอมไพเลอร์ windows ที่จำเป็น
Bret

1
ไม่มีความคิดเห็นใดที่เกี่ยวข้องกับคำตอบนี้!
user3791372

14
ควรระบุว่า sql.js ไม่สามารถทำงานบนระบบไฟล์ได้ ทุกครั้งที่คุณต้องเปลี่ยนฐานข้อมูลคุณต้องเขียนข้อมูลทั้งหมดลงในดิสก์ ทำให้มันค่อนข้างไร้ประโยชน์สำหรับสถานการณ์ส่วนใหญ่
mode777

3
sql.js มันเหมือนของเล่นสร้างมาเพื่อความสนุกสนาน ไม่สามารถดีไปกว่า NeDB และฐานข้อมูล nosql อื่น ๆ ได้เนื่องจากเก็บฐานข้อมูลทั้งหมดไว้ในหน่วยความจำ ดังนั้นจึงไม่มีเหตุผลที่ดีที่จะใช้มัน สำหรับฐานข้อมูลขนาดเล็กให้ใช้ nosql เช่น NeDB สำหรับขนาดใหญ่คุณต้องรวบรวม sqlite
Daimos

10

มีการพิจารณาสองด้านที่นี่:

  1. การตั้งค่าNODE_PATH: สิ่งนี้ช่วยให้อิเล็กตรอนทราบว่าจะหาโมดูลของคุณได้ที่ไหน (ดูคำตอบนี้สำหรับคำอธิบายโดยละเอียด)
  2. การรวบรวมโมดูลเนทีฟกับส่วนหัวของอิเล็กตรอน: ดูเอกสารอย่างเป็นทางการ

และชำระเงินคำถามต่อไปนี้ที่ถามในสิ่งเดียวกัน:


เคล็ดลับของฉันคือให้ลอง lovefield (โดย Google)


ใน Nodewebkit ฉันต้องรวบรวม sqlite กฎเดียวกันใช้กับอิเล็กตรอนหรือไม่?
Wexoni

@Wexoni AFAIK ทุกโมดูลโหนดที่มีการผูกเนทีฟจะต้องรวบรวมกับส่วนหัวของอิเล็กตรอน
Yan Foto

1
@Wexoni ฉันไม่ได้ทำงานกับ NW แต่ฉันรู้ว่าsqlite3ต้องรวบรวมก่อนจึงจะสามารถใช้ในอิเล็กตรอนได้ ฉันเข้าใจคำถามของคุณถูกต้องหรือไม่?
Yan Foto

1
@YannBertrand พวกเขายังคงใช้ส่วนหัวของตัวเอง ดังนั้นฉันคิดว่าคุณยังคงต้องรวบรวมมันกับส่วนหัวของพวกเขา
Yan Foto

1
ขอบคุณสำหรับเคล็ดลับของคุณ lovefield เป็นห้องสมุดที่ยอดเยี่ยมจริงๆ
Mostasim Billah

7

ฉันมีปัญหาเดียวกัน พยายามทุกอย่างและสิ่งนี้ได้ผลสำหรับฉัน: -

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

สิ่งนี้จะสร้างโฟลเดอร์ "electron-v1.3-win32-x64" ใน. \ node_modules \ sqlite3 \ lib \ binding \ location ซึ่งอิเล็กตรอนใช้เพื่อใช้ sqlite3

เพียงแค่เริ่มแอปพลิเคชันและคุณจะสามารถใช้ sqlite3 ได้ทันที


เพิ่งสร้างโฟลเดอร์ว่างเปล่า แต่ยังไม่มีnode_sqlite3.nodeไฟล์อยู่
Mehdi Dehghani

อิเล็กตรอนที่สร้างไว้ล่วงหน้าถูกเปลี่ยนชื่อเป็นอิเล็กตรอน สำหรับรายละเอียดเพิ่มเติมโปรดดูelectron.atom.io/blog/2016/08/16/npm-install-electron
Jacob Nelson

6

วิธีแก้ปัญหาที่ง่ายกว่า:

  1. ติดตั้งสร้างอิเล็กตรอนใหม่ npm i electron-rebuild --save-dev
  2. เปิดตัวสร้างอิเล็กตรอนใหม่./node_modules/.bin/electron-rebuild(หรือ.\node_modules\.bin\electron-rebuild.cmdบน windows)
  3. ไปที่ " node_modules / sqlite3 / lib / binding / " และเปลี่ยนชื่อโฟลเดอร์ " electron-v0.36-darwin-x64 " เป็น " node- v47 -darwin-x64 "

PS: v47เป็นเวอร์ชันของฉันโปรดใช้ความระมัดระวังในการเลือกรุ่นที่ดี (ในกรณีของคุณคือv45 )


4
คุณสามารถอธิบายขั้นตอนที่สามได้หรือไม่? ทำไมต้องเปลี่ยนชื่อ?
m4heshd

4
npm install --save sqlite3
npm install --save-dev electron-rebuild

จากนั้นในสคริปต์ package.json ของคุณให้เพิ่มบรรทัดนี้:

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

จากนั้นติดตั้งใหม่เพื่อเรียกใช้หลังการติดตั้ง:

npm install

ใช้งานได้อย่างไม่มีที่ติสำหรับฉันในกรณีการใช้งานที่ซับซ้อนซึ่งเกี่ยวข้องกับตัวสร้างอิเล็กตรอนอิเล็กตรอนเวบแพ็คและการต่อ

ทำงานในโหมด dev ของ electron-webpack และในโหมดการผลิตสำหรับทั้ง Windows และ Linux


3

ฉันพบข้อผิดพลาดนี้เช่นกัน นี่คือวิธีแก้ปัญหา: npm install --save-dev electron-rebuild แล้ว: ./node_modules/.bin/electron-rebuild

จาก: https://electronjs.org/docs/tutorial/using-native-node-modules

ps: ในขณะที่กำลังสร้างใหม่อย่าใช้npm startเพื่อ lanch แอพอิเล็กตรอน มิฉะนั้นกระบวนการสร้างใหม่จะล้มเหลว


3

มันใช้ได้กับฉันในเวอร์ชัน 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 และมันใช้งานได้ขอบคุณ
Shayana Keiraved Pahal

2

ดูคำตอบที่คล้ายกันได้ที่นี่

TL; ดร

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

3
บทเป็นprepublishอย่างไร?
Victor Ivens

0

คุณสามารถสร้างโมดูลเนทีฟด้วยตนเองโดยใช้ Visual Studio

  1. ดาวน์โหลด Visual Studio 2019
  2. ติดตั้งแพ็คเกจ "การพัฒนาเดสก์ท็อปด้วย c ++" ในแท็บรายละเอียดการติดตั้งเลือก "MSVC v140 - VS 2015 C ++ build tools (v14.00)"
  3. ดาวน์โหลดตัวสร้างอิเล็กตรอนในโครงการของคุณ
  4. ใน package.json สร้างสคริปต์ "scripts": {"postinstall": "install-app-deps"}

  5. จากนั้นเรียกใช้สคริปต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.