electron.js 和 sql - 正确的设置方法?

electron.js and sql - correct way to set it up?

我是 electron.js 的新手 - 一直在阅读文档和一些类似的 post 此处:

但如何正确实施安全 SQL 集成仍然不是很清楚。基本上,我想创建一个桌面数据库客户端。该应用程序将连接到远程数据库,用户可以 运行 所有类型的预定义查询,结果将显示在应用程序中。

文档说,如果您使用的是远程连接,则不应 运行 渲染器中的节点。然后我是否应该在主进程中请求 SQL 模块并使用 IPC 来回发送数据并预加载 IPCremote?

感谢帮助

简答:是

长答案: 在你的渲染器上允许节点会给你的应用带来很大的安全风险。在这种情况下,最好的做法是创建一个传递给预加载器的函数。您可以使用几个选项来执行此操作:

  1. 将包裹在另一个函数中的 ipcRenderer.invoke 函数传递给预加载中的渲染器。然后你可以调用你的主进程,它可以通过相同的函数发送回信息,或者通过 window.webContents.send 命令发送它并在你的 window api 上监听它渲染器。例如:

Preload.js:

const invoke = (channel, args, cb = () => {return}) => {
  ipcRenderer.invoke(channel, args).then((res) => {
    cb(res);
  });
};

const handle = (channel, cb) => {
  ipcRenderer.on(channel, function (Event, message) {
    cb(Event, message);
  });
};

contextBridge.exposeInMainWorld("GlobalApi", {
  invoke: invoke,
  handle:handle
});

渲染器:

let users
window.GlobalApi.handle("users", (data)=>{users=data})
window.GlobalApi.invoke("get", "users")

或:

let users;
window.GlobalApi.invoke("get", "users", (data)=>{users=data})

主要:

ipcMain.handle("get", async (path) => {
 let data = dbFunctions.get(path)

   window.webContents.send(
    path,
    data
  );
}
  1. 在您的预加载脚本中创建一个数据库接口,将某些调用传递给您的渲染器,调用时将 return 您需要从数据库中获得的值。例如

渲染器:

let users = window.myCoolApi.get("users");

Preload.js:

let get = function(path){
    let data =  dbFuncions.readSomeDatafromDB("path");
    return data; // Returning the function itself is a no-no shown below
    // return dbFuncions.readSomeDatafromDB("path"); Don't do this
}
contextBridge.exposeInMainWorld("myCoolApi", {
  get:get
});

还有更多选择,但据我所知,这些通常应该能确保安全。