Escribir en el archivo de "appData" en electrones. Donde añadir importación {app} de "electrón" ;?

votos
0

Estoy haciendo mi primera aplicación de electrones. Estoy tratando de guardar un archivo de texto en la carpeta appData (ejemplo C: \ Users \ usuario \ AppData \ Roaming). Sé que tengo que añadir importación {app} de electrón; en algún lugar, pero no estoy seguro de dónde colocarla.

En mis index.js JavaScript Estoy escribiendo la configuración de base de datos que presente el usuario en su forma a un archivo de texto. Aquí es donde es necesario tener la dirección del directorio appData.

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

toda mi código es el siguiente:

./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.
Publicado el 13/01/2020 a las 21:58
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
2

Sé que tengo que añadir importación {app} de "electrón"; en algún lugar, pero no estoy seguro de dónde colocarla.

La aplicación del módulo es siempre (en mi experiencia), importados en su mainproceso para que pueda controlar el ciclo de vida de las aplicaciones. Sin embargo, si desea utilizar algunas de las appfuncionalidades del módulo en su rendererproceso, puede importar allí a través del remotemódulo (como se muestra en la respuesta aceptada a esta pregunta: ? ¿Cómo utilizar app.getPath de electrones () para almacenar datos )

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

El mainy rendererlos procesos son conceptos clave en Electronlo que yo sugeriría leer sobre ellos. Lo esencial es que usted tiene un mainproceso - que no tiene representación visual y que tiene que ver con el ciclo de vida de la aplicación, crear y destruir rendererlos procesos (como BrowserWindows ), comunicación entre procesos renderer, etc. - y usted puede tener tantos rendererprocesos como necesitas.

Así que si quieres leer y escribir archivos se puede hacer en el rendererproceso como se muestra arriba - o puede hacerlo en el mainproceso. En este último caso, si un rendererproceso quiere guardar un archivo, puede mensaje que el mainproceso a través del IPC , el envío de los datos a guardar.

¿Qué forma de hacerlo es una opción arquitectónica.

Respondida el 14/01/2020 a las 00:08
fuente por usuario

votos
1

Para obtener la ruta a su aplicación principal proceso . A continuación, utilice el código en sus 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, ...);
    }
}

Y va a obtener la ruta desde el procesador a continuación, utilizar este código a su procesador

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

Sin embargo, para el uso requieren a su procesador, por favor asegúrese de nodeintegration es cierto.

Si yo fuera tú, me iba a obtener la ruta aplicación en el proceso principal y almacenar el archivo en proceso principal también. Por lo tanto, la importación de muchas dependencias en el proceso de renderización no es una opción buena. El proceso de renderización ocupa principalmente de mostrar su aplicación en el navegador Chromium.

Así que para hacer esta operación en el proceso principal . Utilizar esta

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

En el proceso de renderización añadir este código.

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

Como se puede ver, en el proceso de renderización , este es el envío de la inp_datade su principal proceso a través de 'WRITE_TEXT' canal de IPC .

Una cosa más que aquí, en su código. Va a conectar la base de datos a su procesador y es posible, pero esto no es una decisión correcta. Por favor, pensar mientras se está teniendo el procesador de varios. Debe moverse a este proceso principal también.

Respondida el 14/01/2020 a las 03:32
fuente por usuario

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