/ / Problem z elektronem i sqlite3 po pakowaniu aplikacji - javascript, angularjs, node.js, sqlite3, elektron

Problem z elektroniką i sqlite3 po aplikacji do pakowania - javascript, angularjs, node.js, sqlite3, elektron

Zadałem ostatnio kilka pytań, ponieważ ciągle utknąłem w różnych częściach węzła i baz danych.

W każdym razie trochę tła:

Mam aplikację Electron z interfejsem AngularJS. Tak więc, po stronie elektronów rzeczy, faktycznie rozpoczynam ekspresowy serwer, który obsługuje moją kanciastą aplikację, która może wtedy oczywiście rozmawiać z elektronem przez ipc. Korzystam również z wyraźnej strony rzeczy do wykonania zawartości bazy danych (sqlite3), definiując trasy dla api, które Angular może trafić za pomocą $ http i zwraca wyniki db w ten sposób. Wszystko działa absolutnie dobrze, gdy uruchomię aplikację z "npm start". Kod strony db / serwer rzeczy jest następujący:

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);

Poza tym tutaj jest mój plik main.js, który wymaga tego pliku server.js:

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);
});

Problem, który mam, polega na tym, że podczas pakowania aplikacji używam https://github.com/electron-userland/electron-builder, funkcje aplikacji, serwer jest odwirowany ikomponenty Angular działają dobrze, ale nie mogę odczytać / zapisać / utworzyć pliku bazy danych, jak to możliwe przed pakowaniem. W końcu nie mam pojęcia, gdzie szukać!

Odpowiedzi:

1 dla odpowiedzi № 1

Udało mi się to naprawić prawie przypadkowopo chwili waląc głową o biurko. Próbowałem zaimplementować niektóre rejestrowanie, aby sprawdzić, czy wystąpiły problemy z nieprawidłowym rozpoznawaniem modułu węzła po jego zapakowaniu, gdy zauważyłem, że plik dziennika nie został utworzony w miejscu, w którym oczekiwałam - był tworzony poza obszarem rzeczywisty katalog aplikacji i dlatego nie był dostępny. To samo stało się z moim plikiem bazy danych.

Zobacz poprawkę poniżej:

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

Dodanie __dirname do definicji pliku db rozwiązało problem!