Как переместить вызовы ipcMain.on за пределы main.js файл

#javascript #electron #ipcrenderer #ipcmain

#javascript #электрон #ipcrenderer #ipcmain

Вопрос:

Я работаю над проектом с Electron и React. Я собираюсь выполнить несколько вызовов базы данных через ipcMain и ipcRenderer, поэтому я переместил вызовы для ipcMain в другой файл (ipcMainHandler.js ).

Проблема, с которой я сталкиваюсь сейчас, заключается в том, как отправлять ответы обратно в ipcRenderer. Я не могу получить доступ к MainWindow из этого файла.

Это код для моего основного файла.

 const url = require('url');

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

let mainWindow;

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
      enableRemoteModule: true,
      preload: __dirname   '/preload.js'
    },
  });

  const startUrl =
    process.env.ELECTRON_START_URL ||
    url.format({
      pathname: path.join(__dirname, './build/index.html'),
      protocol: 'file:',
      slashes: true,
    });

  mainWindow.loadURL(startUrl);
  mainWindow.webContents.openDevTools();
  mainWindow.on('closed', function () {
    mainWindow = null;
  });
}

app.on('ready', createWindow);
app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});
app.on('activate', function () {
  if (mainWindow === null) {
    createWindow();
  }
});

require('./src/server/helpers/ipcMainHandler.js');
 

В ipcMainHandler.js файл

 const { SIGNIN_REQUEST, SIGNIN_RESPONSE } = require('../../common/events.js');
const { ipcMain } = require('electron');

ipcMain.on(SIGNIN_REQUEST, (event, data) => {
  const user = AuthController.userSignin({ ...data });
});
 

Вещи, которые я пробовал

  • Доступ к текущему окну с удаленного — выдает удаленную неопределенную ошибку
  • Добавление MainWindow в глобальную переменную и попытка получить к ней доступ в ipcHander. — Это также возвращает неопределенное сообщение.

Ответ №1:

Проблема решена. Я использовал объект события для отправки ответа от ipcMain.

 ipcMain.on(SIGNIN_REQUEST, async (event, data) => {
  const user = await AuthController.userSignin({ ...data });
  event.sender.send(SIGNIN_RESPONSE, user);
});