2016-09-27 2 views
1

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!

+1

Verwenden Sie nicht '__dirname' für die db-Datei, für die Produktion 'app.getPath (' userData ')' ist der Wert besser geeignet. –

+0

@MariusDarila Würde dies beim Erstellen oder Zugreifen auf die Datei einen Unterschied machen, wenn die Elektronen-App gepackt wird? –

+0

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! –

Antwort

1

Ich habe es geschafft, dies fast zufällig zu beheben, nachdem ich meinen Kopf für eine Weile gegen meinen Schreibtisch geschlagen hatte. Ich habe versucht, eine Protokollierung zu implementieren, um festzustellen, ob Probleme mit dem Knotenmodul beim Packen nicht korrekt erkannt wurden, als ich bemerkte, dass die Protokolldatei nicht dort erstellt wurde, wo ich sie erwartet hatte - sie wurde außerhalb des das aktuelle App-Verzeichnis und war daher nicht zugänglich. Das Gleiche ist mit meiner Datenbankdatei passiert.

Siehe unten beheben:

var db = new sqlite3.Database(__dirname + '/app.db'); 

Die Zugabe von __dirname an die DB-Datei Definition das Problem behoben haben!

+3

Wie @MariusDarila erwähnt, ist dies ein Fehler, wenn der Benutzer keine Berechtigung zum Schreiben in das Verzeichnis hat, in dem die Anwendung installiert ist. Sie sollten die Datenbankdatei an dem von 'app.getPath ('userData') 'zurückgegebenen Speicherort erstellen . –

Verwandte Themen