Schrijf naar bestand in "appData" in Electron. Waar te importeren {app} toevoegen van "electron" ;?

stemmen
0

Ik maak mijn eerste Electron applicatie. Ik ben op zoek naar een tekstbestand naar de map appData (bijvoorbeeld C: \ Users \ gebruikersnaam \ AppData \ Roaming) op te slaan. Ik weet dat ik moet toevoegen import {app} van electron; sommige waar, maar ik ben niet zeker weet waar te plaatsen.

In mijn index.js Javascript Ik schrijf de database-instellingen die de gebruiker merkt in zijn vorm naar een tekstbestand. Dit is waar ik nodig om de appData directory-adres hebben.

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

Mijn hele code staat hieronder:

./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.
De vraag is gesteld op 13/01/2020 om 23:58
bron van user
In andere talen...                            


2 antwoorden

stemmen
2

Ik weet dat ik moet importeren {app} toevoegen van "electron"; sommige waar, maar ik ben niet zeker weet waar te plaatsen.

De app module is altijd (in mijn ervaring) in uw geïmporteerde mainproces, zodat u de toepassingen levenscyclus kan controleren. Echter, als je wilt een aantal van de te gebruiken appmodule-functionaliteit in uw rendererproces, kunt u het daar importeren via de remotemodule (zoals aangegeven in de geaccepteerde antwoord op deze vraag: ? Hoe elektron app.getPath () gebruiken om gegevens op te slaan )

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

De mainen rendererprocessen zijn sleutelbegrippen in Electron, dus ik het lezen over die zou suggereren. De essentie is dat je er een mainproces - het heeft geen visuele representatie en is betrokken bij de levenscyclus van uw app, het creëren van en het vernietigen van rendererprocessen (zoals BrowserWindows ), de communicatie tussen renderer processen, etc. - en je kunt zo velen hebben rendererprocessen jij hebt nodig.

Dus als je wilt lezen en schrijven bestanden die u kunt doen in het rendererproces zoals hierboven weergegeven - of u kunt het doen in het mainproces. In het laatste geval, als een rendererproces wil een bestand op te slaan, kan het bericht het mainproces door middel van IPC , het verzenden van de gegevens moeten worden opgeslagen.

Welke manier je het doet is een architectonisch keuze.

antwoordde op 14/01/2020 om 02:08
bron van user

stemmen
1

Om de app pad aan uw krijgen hoofdproces . Maak dan gebruik van deze code op uw 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, ...);
    }
}

En naar het pad van de get renderer gebruik dan deze code op uw renderer

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

Maar om gebruik te eisen dat uw renderer, moet u ervoor zorgen nodeintegration is waar.

Als ik jou was, ik was van plan om de app pad op te krijgen belangrijkste proces en sla het bestand op hoofdproces ook. Vandaar dat het importeren veel afhankelijkheden op renderer proces is niet een goede keuze. De renderer proces vindt voornamelijk zorg voor het tonen van uw app in de Chromium browser.

Dus om deze operatie op te maken hoofdproces . Gebruik dit

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

Bij uw rendererproces deze code toevoegen.

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

Zoals u kunt zien, op renderer proces , dit is het verzenden van het inp_datanaar uw belangrijkste proces door middel van 'WRITE_TEXT' IPC-kanaal .

Nog een ding hier, op uw code. Je verbindt je DB op uw renderer en het is mogelijk, maar dit is niet een juiste keuze. Gelieve te denken terwijl u met de verschillende renderer. U dient deze te verplaatsen naar hoofdproces.

antwoordde op 14/01/2020 om 05:32
bron van user

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