Ich habe vor kurzem einige Fragen gestellt, da ich ständig mit verschiedenen Teilen von Knoten und Datenbanken festhängen bin.Electron und sqlite3 Problem nach dem Verpacken App
Wie auch immer, ein wenig Hintergrund:
Ich habe eine Electron App mit einem AngularJS Frontend. Also auf der Elektronenseite der Dinge spin ich tatsächlich einen Express-Server, der meine eckige App bedient, die dann natürlich über ipc mit dem Elektron sprechen kann. Ich benutze auch die Express-Seite der Dinge, um die Datenbank-Sachen (sqlite3) zu tun, Routen für eine API zu definieren, die Angular mit $ http treffen kann und db-Ergebnisse auf diese Weise zurückgegeben haben. Alles funktioniert einwandfrei, wenn ich die App mit 'npm start' starte. Der Code für den db/Server-Seite der Dinge ist wie folgt:
var path = require('path');
var express = require('express');
var app = express();
var fs = require('fs');
var bodyParser = require('body-parser');
var path = require('path');
var sqlite3 = require('sqlite3').verbose();
// Load the db
function createDbFile() {
// Try to open the db file - if it doesn't exist, create it.
try {
var filebuffer = fs.readFileSync(path.join(__dirname, 'app.db'));
}
catch (err) {
if (err.code === 'ENOENT') {
fs.closeSync(fs.openSync(path.join(__dirname, 'app.db'), 'w'));
}
else {
throw err;
}
}
}
createDbFile();
var db = new sqlite3.Database('app.db');
var check;
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();
});
app.use(express.static(__dirname));
// app.use(bodyParser.json());
app.get('/', function (req, res) {
res.sendFile(__dirname + 'index.html');
});
app.get('/loading', function (req, res) {
res.sendFile(__dirname + '/loading.html');
});
app.get('/api/get/all', function (req, res) {
db.all("SELECT * FROM lorem", function(err, row) {
res.json(row);
});
});
app.post('/api/post/site', function (req, res) {
// Do stuff here.
});
app.listen(3333);
Sowie, dass, hier ist meine main.js-Datei, die diese server.js Datei benötigt:
const electron = require('electron');
const server = require("./server");
const ipcMain = require('electron').ipcMain;
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
// Define our global references
let mainWindow,
loadingScreen,
windowParams = {
width: 1000,
height: 700,
show: false
},
loadingWindowParams = {
width: 400,
height: 300,
show: false,
frame: false
};
// Define our loading window whose parent is main
function createLoadingScreen() {
loadingScreen = new BrowserWindow(Object.assign(loadingWindowParams, {parent: mainWindow}));
loadingScreen.loadURL('http://localhost:3333/loading');
loadingScreen.on('closed',() => loadingScreen = null);
loadingScreen.webContents.on('did-finish-load',() => {
loadingScreen.show();
});
}
app.on('ready',() => {
// Create loading screen
createLoadingScreen();
// Create the browser window.
mainWindow = new BrowserWindow(windowParams);
// Point to our express server
mainWindow.loadURL(`http://localhost:3333`);
// Open the DevTools.
mainWindow.webContents.openDevTools();
// Simulate loading to allow angular to initialize, then show main window
mainWindow.once('ready-to-show',() => {
if (loadingScreen) {
setTimeout(function() {
loadingScreen.close();
mainWindow.show();
}, 6000);
}
});
// Close the app after window closed for security purposes
mainWindow.on('closed', function() {
mainWindow = null
app.quit();
});
// Handle messages
ipcMain.on('electron-msg', (event, msg) => {
switch (msg.type) {
case 'system':
mainWindow.webContents.send('electron-msg', 'Message received');
break;
}
});
});
// Quit when all windows are closed.
app.on('window-all-closed', function() {
if (process.platform !== 'darwin') {
app.quit()
}
});
// Open window again when activated
app.on('activate', function() {
if (mainWindow === null) {
// Not currently needed, we quit when window closed
}
});
// Throw our errors
process.on('uncaughtException', function (err) {
console.log(err);
});
Die Frage Ich habe das, wenn ich meine App mit https://github.com/electron-userland/electron-builder verpacke, funktioniert die App, der Server ist hochgefahren und die Angular-Komponenten funktionieren gut, aber ich kann nicht lesen/schreiben/erstellen Sie eine Datenbank-Datei wie ich kann vor dem Verpacken. Ich bin jetzt letztlich ratlos, wohin ich schauen soll!
Verwenden Sie nicht '__dirname' für die db-Datei, für die Produktion 'app.getPath (' userData ')' ist der Wert besser geeignet. –
@MariusDarila Würde dies beim Erstellen oder Zugreifen auf die Datei einen Unterschied machen, wenn die Elektronen-App gepackt wird? –
Ich entfernte den Aufruf der Funktion, die die Datei erstellt, da Database ('app.db') die Datei tatsächlich erstellt, wenn sie nicht existiert - zumindest lokal. Ich kann das immer noch nicht zur Arbeit bringen! –