electron ipcMain.handle中的fs.readdir不返回

rpppsulh  于 2023-05-11  发布在  Electron
关注(0)|答案(3)|浏览(277)

它总是返回undefined,请问有什么想法?我需要返回内部fs.reddir但相对于ipcMain

//main

ipcMain.handle('pegaDirRomSalvo', async (event, argx=0) => {
  fs.readFile('dataCR.txt', 'utf8', function (err,data) {

    if (err) {return '0'}
    fs.readdir(data, (err, files) => {
          if (err) {throw err;}
          return [data,files] //<-------- not going
    })
   
  })
})

//render

ipcRenderer.invoke('pegaDirRomSalvo',a=0).then((result)=>{
         document.getElementById('divCaminho').innerText = result[0]
})
iugsix8n

iugsix8n1#

您需要使用event.sender.send来触发另一个从mainrenderer进程的调用,以返回结果,最后一个进程将使用ipcRenderer.on来侦听它。以下是示例解决方案:

渲染器:

const { ipcRenderer } = require('electron');
ipcRenderer.invoke('pegaDirRomSalvo', a=0);
ipcRenderer.on('FILES_LIST_FETCHED', (event, result) => {
     console.log(result);
     document.getElementById('divCaminho').innerText = result[0]
});

主:

const { ipcMain } = require('electron');
ipcMain.handle('pegaDirRomSalvo', async (event, argx=0) => {
     fs.readFile('dataCR.txt', 'utf8', function (err,data) {
          if (err) { return '0'; }
          fs.readdir(data, (err, files) => {
               if (err) {throw err;}
               event.sender.send('FILES_LIST_FETCHED', [data, files]);
          })
     });
});

如果需要,您可以使用相同的方法返回错误详细信息。
EDIT:此技术通常用于使用ipcRenderer.send发送renderer调用,并使用ipcMain.onmain进程上接收它。

aiazj4mn

aiazj4mn2#

ipcMain.handle(channel, listener)文档:
如果listener返回Promise,则Promise的最终结果将作为响应返回给远程调用者。否则,侦听器的返回值将用作应答的值。

// main
ipcMain.handle("pegaDirRomSalvo", (event, argx = 0) => {
  return new Promise((resolve, reject) => {
    fs.readFile("dataCR.txt", "utf8", function (err, data) {
      if (err) {
        reject(err);
        return;
      }
      fs.readdir(data, (err, files) => {
        if (err) {
          reject(err);
          return;
        }
        resolve([data, files]);
      });
    });
  });
});

// render
ipcRenderer.invoke("pegaDirRomSalvo", (a = 0)).then((result) => {
  document.getElementById("divCaminho").innerText = result[0];
});

可以使用async/awaitfs.promises重构代码,使其更具可读性

// main
const fsPromisified = require("fs/promises");

ipcMain.handle("pegaDirRomSalvo", async () => {
  const data = await fsPromisified.readFile("dataCR.txt", "utf-8");
  const files = await fsPromisified.readdir(data);
  return [data, files];
});

// render
(async () => {
  try {
    const result = await ipcRenderer.invoke("pegaDirRomSalvo");
    document.getElementById("divCaminho").innerText = result[0];
  } catch (err) {
    // handle errors
  }
})();

或者可以在主进程中处理错误

toe95027

toe950273#

任何人在未来看这个:
只是有同样的问题,我没有“访问”ipcRenderer在我的渲染脚本。然而,使用预加载脚本,关键是在contextBridge.exposeInMainWorld API中返回ipcRenderer.invoke的“承诺结果”:

// preload.js
const { contextBridge, ipcRenderer } = require("electron");

contextBridge.exposeInMainWorld("renderer", {
  pegaDirRomSalvo: async (argx) => { 
    return ipcRenderer.invoke('pegaDirRomSalvo',a=0)
      .then((result)=>{
        return result;
      }
    )
  }
});

现在你可以在主文件中创建函数了

//main.js
ipcMain.handle('pegaDirRomSalvo', async (event, argx=0) => {
  fs.readFile('dataCR.txt', 'utf8', function (err,data) {
    if (err) {return '0'}
    fs.readdir(data, (err, files) => {
      if (err) {throw err;}
      return [data,files]
    })
  })
})

在renderer中调用它(即const val = window.renderer.pegaDirRomSalvo(1))将(应该)返回[data,files]的内容

相关问题