Schreibe Datei in "appData" in Electron. Wo hinzufügen Import {app} von „Elektron“ ;?

stimmen
0

Ich mache meine erste Electron Anwendung. Ich versuche , eine Textdatei mit dem appData Ordner (zB C: \ Benutzer \ Benutzer \ AppData \ Roaming) zu speichern. Ich weiß , ich muss hinzufügen Import {app} von „Elektron“; einige , wo , aber ich bin nicht sicher , wo es zu platzieren.

In meinem index.js JavaScript ich die Datenbankeinstellungen schreibe, dass die Benutzer sendet in seiner Form in eine Textdatei. Dies ist, wo ich brauche die appData Verzeichnis-Adresse haben.

// Write data to text file
var filepath = app.getPath(appData) 
var filename = database_quick_image_forensics.txt
var inp_data = inp_host + | + inp_username + | + inp_password + | + inp_database_name + | + inp_table_prefix;
write_to_file(filepath, filename, inp_data);

Mein ganzer Code ist unten:

./setup/index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset=UTF-8>
    <title>Setup</title>
    <!-- https://electronjs.org/docs/tutorial/security#csp-meta-tag -->

        <!-- CSS -->
            <link rel=stylesheet type=text/css href=../_webdesign/dark/dark.css />
        <!-- // CSS -->


    <!-- jQuery -->
    <script>window.$ = window.jQuery = require('../javascripts/jquery/jquery-3.4.1.js');</script>
    <script src=../javascripts/jquery/jquery-3.4.1.js charset=utf-8></script>
    <!-- //jQuery -->

    <!-- jQuery -->
    <script src=./index.js charset=utf-8></script>
    <!-- //jQuery -->
</head>
<body>
<div id=main_single_column>
  <h1>Setup</h1>

<!-- Feedback -->
    <div id=feedback_div class=success>
        <p id=feedback_p>Success</p>
    </div>
<!-- //Feedback -->

<!-- Database connection form -->

      <p>Host:<br />
      <input type=text name=inp_host id=inp_host value=localhost />
      </p>

      <p>Port:<br />
      <input type=text name=inpport id=inp_port value= />
      </p>

      <p>Username:<br />
      <input type=text name=inp_username id=inp_username value=root />
      </p>

      <p>Password:<br />
      <input type=text name=inp_password id=inp_password />
      </p>

      <p>Database name:<br />
      <input type=text name=inp_database_name id=inp_database_name value=quick />
      </p>

      <p>Table prefix:<br />
      <input type=text name=inp_table_prefix id=inp_table_prefix value=cf_ />
      </p>

      <p>
      <button id=form_connect_to_database_submit>Connect to database</button>
      </p>

<!-- //Database connection form -->
</div>



</body>
</html>

./setup/index.js

const fs = require('fs');

// Action = On submit
$(document).ready(function(){

    $(#form_connect_to_database_submit).click( function() {
        // Feedback
        $('#feedback_div').show();
        $('#feedback_div').removeClass(success);
        $('#feedback_div').addClass(info);
        $('#feedback_p').text(Connecting!)

        // get all the inputs
        var inp_host = $(#inp_host). val();
        var inp_username = $(#inp_username). val();
        var inp_password = $(#inp_password). val();
        var inp_database_name = $(#inp_database_name). val();
        var inp_table_prefix = $(#inp_table_prefix). val();

        // Test connection
        var connection_result = connect_to_database(inp_host, inp_username, inp_password, inp_database_name, inp_table_prefix);
        if(connection_result != connection_ok){
            // Connection Failed
            $('#feedback_div').removeClass(info);
            $('#feedback_div').addClass(error);
            $('#feedback_p').text(connection_result)
        }
        else{
            // Connection OK
            $('#feedback_div').removeClass(info);
            $('#feedback_div').addClass(success);
            $('#feedback_p').text(Connected)

            // Write data to text file
            var filepath = app.getPath(appData) 
            var filename = database_quick_image_forensics.txt
            var inp_data = inp_host + | + inp_username + | + inp_password + | + inp_database_name + | + inp_table_prefix;
            $('#feedback_p').text(Connected  + filepath)
            write_to_file(filepath, filename, inp_data);

            // Feedback
            $('#feedback_div').removeClass(info);
            $('#feedback_div').addClass(success);
            $('#feedback_p').text(Connected to)
        }




    });
    $('#inp_host').focus();
});


// Function connect to database
function connect_to_database(inp_host, inp_username, inp_password, inp_database_name, inp_table_prefix){
    var mysql = require('mysql');

    // Add the credentials to access your database
    var connection = mysql.createConnection({
        host     : inp_host,
        user     : inp_username,
        password : null, // or the original password : 'apaswword'
        database : inp_database_name
    });

    // connect to mysql
    connection.connect(function(err) {
        // in case of error
        if(err){
            console.log(err.code);
            console.log(err.fatal);
            return err.code;
        }
    });


    // Perform a query
    $query = 'SELECT * FROM `cf_admin_liquidbase` LIMIT 10';
    connection.query($query, function(err, rows, fields) {
        if(err){
            console.log(An error ocurred performing the query.);
            console.log(err);
            return;
        }
        console.log(Query succesfully executed, rows);
    });

    return connection_ok;
} // connect_to_database




// Function write setup
function write_to_file(filepath, filename, inp_data){


    var fullpath = filepath + \\ + filename;
    fs.writeFile(fullpath, inp_data, (err) => {
        // throws an error, you could also catch it here
        if (err) throw err;
        // success case, the file was saved
        console.log('Lyric saved!');
    });
} // write_to_file

./main.js

const { app, BrowserWindow } = require('electron')


// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let win


function createWindow () {
  // Create the browser window.
  win = new BrowserWindow({
          width: 800,
          height: 600,
          webPreferences: {
          nodeIntegration: true
          }
  })

  // and load the index.html of the app.
  win.loadFile('index.html')

  // Open the DevTools.
  // win.webContents.openDevTools()

  // Emitted when the window is closed.
  win.on('closed', () => {
          // Dereference the window object, usually you would store windows
          // in an array if your app supports multi windows, this is the time
          // when you should delete the corresponding element.
          win = null
  })
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', createWindow)

// Quit when all windows are closed.
app.on('window-all-closed', () => {
  // On macOS it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== 'darwin') {
          app.quit()
  }
})

app.on('activate', () => {
  // On macOS it's common to re-create a window in the app when the
  // dock icon is clicked and there are no other windows open.
  if (win === null) {
          createWindow()
  }
})

// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.
Veröffentlicht am 13/01/2020 um 23:58
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
2

Ich weiß, ich brauche Import hinzufügen {app} von „Elektron“; einige, wo, aber ich bin nicht sicher, wo es zu platzieren.

Das App - Modul ist immer (in meiner Erfahrung) in importierten mainProzess , so dass Sie die Anwendungen Lifecycle steuern können. Allerdings, wenn Sie wollen einen Teil der verwenden appin Ihrem Modul Funktionalität rendererProzess, können Sie sie importieren den dort durch remoteModul (wie in der akzeptierten Antwort auf diese Frage gezeigt: ? Wie Elektronen app.getPath () zum Speichern von Daten verwenden )

const remote = require('electron').remote;
const app = remote.app;
console.log(app.getPath('userData'));

Die mainund rendererProzesse sind Schlüsselbegriffe in Electronso würde ich vorschlagen auf denen zu lesen auf. Der Kern ist , dass Sie eine haben mainProzess - es hat keine visuelle Darstellung und ist es mit dem Lebenszyklus Ihrer App beteiligt ist , zu schaffen und zu zerstören rendererProzesse (wie BrowserWindows ), die Kommunikation zwischen Renderer Prozessen usw. - und Sie können so viele haben rendererProzesse wie du brauchst.

Also , wenn Sie lesen und schreiben Dateien möchten , können Sie es im tun rendererVerfahren , wie oben gezeigt - oder Sie können es in den tun mainProzess. Im letzteren Fall, wenn eine rendererwill Prozess eine Datei speichern, kann es Nachricht der mainProzess durch IPC , das Senden der Daten gespeichert werden.

Welchen Weg Sie tun es ist eine architektonische Wahl.

Beantwortet am 14/01/2020 um 02:08
quelle vom benutzer

stimmen
1

Um den App Weg an Ihrem Hauptprozess . Dann nutzen Sie diesen Code auf Ihrer main.js

switch(process.platform) {
    case 'darwin': {
      return path.join(process.env.HOME, 'Library', 'Application Support', ...);
    }
    case 'win32': {
      return path.join(process.env.APPDATA, ...);
    }
    case 'linux': {
      return path.join(process.env.HOME, ...);
    }
}

Und geht den Weg vom bekommen Renderer dann diesen Code auf Ihrem verwenden Renderer

const remote = require('electron').remote;
const app = remote.app;
console.log(app.getPath('userData'));

Aber um den Einsatz an Ihrem Renderer benötigen, stellen Sie bitte sicher nodeintegration wahr ist.

Wenn ich Sie wäre, würde ich die app Weg bekommen Hauptprozess und die Datei speichern Hauptprozess als auch. Daher viele Abhängigkeiten bei der Import - Renderer - Prozess ist nicht eine gute Wahl. Der Renderer - Prozess nimmt vor allem die Pflege Ihrer App im Chromium - Browser zeigt.

So machen Sie diesen Vorgang bei Hauptprozess . Benutze das

bei Ihrem main.js

  const { ipcMain } = require('electron')
  const appPath = () => {
    switch(process.platform) {
      case 'darwin': {
        return path.join(process.env.HOME, 'Library', 'Application Support');
      }
      case 'win32': {
        return process.env.APPDATA;
      }
      case 'linux': {
        return process.env.HOME;
      }
    }
  }

  const writeToFile = (fileName, inData) => {
      const fullPath = path.join(appPath(), "\\", fileName);
      fs.writeFile(fullPath, inData, (err) => {
        // throws an error, you could also catch it here
        if (err) throw err;
        // success case, the file was saved
        console.log('Lyric saved!');
    });
  } // write_to_file

  ipcMain.on('WRITE_TEXT', async (event, arg) => {
    writeToFile(arg.fileName, arg.inData)
  });

Bei Ihrem Renderer-Prozess diesen Code hinzufügen.

const {ipcRenderer} = require('electron')
ipcRenderer.sendSync('WRITE_TEXT',{fileName, inData})

Wie Sie bei sehen Renderer - Prozess , sendet dies inp_datazu Ihrem Hauptprozess durch ‚WRITE_TEXT‘ IPC - Kanal .

Eine weitere Sache hier, um Ihren Code. Sie sind Ihre DB an Ihrem Renderer verbinden und es ist möglich, aber dies ist nicht eine richtige Wahl. Bitte denken Sie, während Sie die verschiedenen Renderer haben. Sie sollten auch diese zum Hauptprozess bewegen.

Beantwortet am 14/01/2020 um 05:32
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more