电子“要求未定义”

2023-11-23

我正在制作一个应用程序,我需要授予对文件系统(fs)模块的访问权限,但是即使使用nodeIntegration启用渲染器给我这个错误:

Uncaught ReferenceError: require is not defined

我能找到的所有类似问题都有一个解决方案,表明他们需要转向nodeIntegration上,但我已经启用了它。

这是我的 main.js:

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

let win;

app.on('ready', () => {
    var { width, height } = electron.screen.getPrimaryDisplay().workAreaSize;
    width = 1600;
    height = 900;
    win = new BrowserWindow({'minHeight': 850, 'minWidth': 1600, width, height, webPreferences: {
        contextIsolation: true,
        webSecurity: true,
        nodeIntegration: true
    }});
    win.setMenu(null);
    win.loadFile('index.html');
    win.webContents.openDevTools()
});

我的index.js,在index.html 中链接为<script src="index.js"></script>目前只有require("fs");在其中,我已经注释掉了所有其他内容。

我不知道为什么 require 仍然不起作用nodeIntegration已启用。


当你有nodeIntegration已禁用但未使用contextIsolation,您可以使用预加载脚本在全局对象上公开它的安全版本。 (注意:你不应该暴露整个fs模块到远程页面!)

以下是以此方式使用预加载脚本的示例:

// main process script
const mainWindow = new BrowserWindow({
  webPreferences: {
    contextIsolation: false,
    nodeIntegration: false,
    preload: './preload.js'
  }
})

mainWindow.loadURL('my-safe-file.html')



// preload.js
const { readFileSync } = require('fs')

// the host page will have access to `window.readConfig`,
// but not direct access to `readFileSync`
window.readConfig = function () {
  const data = readFileSync('./config.json')
  return data
}



// renderer.js
const config = window.readConfig()

如果您仅加载本地页面,并且这些页面不加载或执行不安全的动态内容,那么您might重新考虑使用contextIsolation对于这个策略。如果你想保留contextIsolation但是,如果您有机会显示不安全的内容,您绝对应该这样做),您只能与预加载脚本进行通信消息通过postMessage.

这是上面相同场景的示例,但是contextIsolation并使用消息传递。

// main process script
const mainWindow = new BrowserWindow({
  webPreferences: {
    contextIsolation: true,
    nodeIntegration: false,
    preload: './preload.js'
  }
})

mainWindow.loadURL('my-unsafe-file.html')



// preload.js
const { readFileSync } = require('fs')

const readConfig = function () {
  const data = readFileSync('./config.json')
  return data
}

window.addEventListener('message', (event) => {
  if (event.source !== window) return
  if (event.data.type === 'request') {
    window.postMessage({ type: 'response', content: readConfig() })
  }
})



// renderer.js
window.addEventListener('message', (event) => {
  if (event.source !== window) return
  if (event.data.type === 'response') {
    const config = event.data.content
  }
})
window.postMessage('request')

虽然这肯定更冗长且难以处理(并且强制事情异步,因为消息传递是异步的),但它也更安全。一对小的 JS 包装器围绕postMessageAPI 可以使这更容易使用(例如通过类似 RPC 的机制),但请记住使用的全部意义contextIsolation是因为你不能信任渲染器,所以你的预加载脚本不应该信任它通过渲染器获得的任何消息postMessageAPI — 您应该始终验证收到的事件以确保您信任它。

这个幻灯片详细描述了为什么在不使用上下文隔离的情况下关闭节点集成并不总是一个好主意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

电子“要求未定义” 的相关文章

随机推荐

  • MySQL 与 Group By 的一对多连接仅返回一个观察结果

    我有一个评论表和一个标签表 对于每个评论 可以有多个标签 也可以没有 我想加入这两个 这样我就可以获得每个评论的标签列表 评论表 CommentID Title 1 animals 2 plants 标签表 TagID CommentID
  • CustomTableCellView 的 -layoutSubviews 实现需要调用 super , NSInternalInconsistencyException

    在 tableView xib 的自定义单元格中使用 autoLayout 时 我收到以下错误 在 iOS 6 模拟器中运行时CustomCells的 layoutSubviews的实现需要调用super Assertion failure
  • 2 个双数之间的随机数

    是否可以在 2 个双精度数之间生成一个随机数 Example public double GetRandomeNumber double minimum double maximum return Random NextDouble min
  • 使用 SIMD 内在函数时这些额外的反汇编指令是什么?

    我正在测试使用 SIMD 指令与 RyuJIT 可以获得什么样的加速 并且我看到了一些我不期望的反汇编指令 我的代码基于这篇博文来自 RyuJIT 团队的 Kevin Frei 以及相关帖子here 这是函数 static void Add
  • QT Creator,c++11 语法检查

    如何关闭 c 11 基于循环范围的运算符的错误突出显示 代码下的红色波浪 int myint 1 2 3 4 5 for auto x myint 悬停提示显示 意外令牌 代码编译完美 另一个问题 自动完成不显示unique ptr in
  • 布局预览中的 TextClock 渲染问题

    当我在布局 Android Studio 布局预览中创建 TextClock 小部件时 没有显示更改 但在调试设备上小部件工作得很好 如果我评论它布局预览工作成功 另一台PC Android Studio工作成功并显示TextClock 错
  • SPRING MVC 中的 URL 模式限制

    我的 Spring Web MVC 应用程序在控制器中具有以下处理程序映射 RequestMapping method RequestMethod GET value something 当请求发送至 http www someURL co
  • Linux 排序不适用于负浮点数

    如何对这种输入进行排序 0 00159265291648695254 0 00318530179313823899 0 0 00999983333416666468 0 00362937767285478371 0 004777942590
  • 将数据框的两列转换为命名向量

    我需要转换多行两列data frame到一个命名的字符向量 我的data frame会是这样的 dd data frame crit c a b c d name c Alpha Beta Caesar Doris 我真正需要的是 what
  • 是否可以以编程方式抛出 APPWIDGET_UPDATE 的意图?

    想要我的小部件中的一个按钮来触发小部件类上的 APPWIDGET UPDATE 意图以强制更新 但我没有将 APPWIDGET UPDATE 视为意图中的静态字段 这可能吗 如何做到这一点 Intent intent new Intent
  • 如何更改列表框项目的文本?

    我有一个Listbox充满了项目 我需要更改项目的文本 使用项目配置我只能找到如何更改颜色 如何更改 Tkinter 上的项目文本Listbox 要更改文本 您必须删除并在正确的索引处重新添加项目 这是一个不断更新列表框中第二项的人为示例
  • android studio 错误:无法启动守护进程

    Android Studio 2 2版本 操作系统版本 Windows 10 Java JRE JDK版本 1 8 0 51 错误 无法启动守护进程 这个问题可能是守护进程配置不正确造成的 例如 一个使用了无法识别的 jvm 选项 请参阅用
  • 何时应用数据绑定?

    在对象生命周期的什么时间第一次解析绑定 这是一个简单的问题 但我在书籍和谷歌上都找不到任何信息 其实事情没那么简单 你不会得到这个问题的直接答案 这取决于上下文 这是两个简单的例子 如果有界属性由不在 ControlTemplate 内的
  • 在 Ionic 2 中禁用侧边菜单的滑动打开登录页面(或任何页面)的手势

    我是 Ionic 2 和 Angular2 的新手 我已经使用以下命令下载了新的 Ionic 模板 Ionic start appname sidemenu v2 ts 对于这个特定的解决方案 我添加了一个登录页面来验证用户 验证成功后 用
  • 更改轴而不更改数据 (Python)

    我如何绘制一些数据 删除由该数据创建的轴 然后用不同比例的轴替换它们 假设我有类似的东西 import matplotlib pyplot as plt fig plt figure ax fig add subplot 111 plt x
  • Nginx + (nodejs、socketio、express) + php 站点

    我正在开发一个完全 js HTML5 画布游戏 并希望它是 实时 的 根据我的研究 我发现 Node js 是一个令人兴奋的前景 因此我在我的 ubuntu 12 Web 服务器上使用 socket io express 等配置了它 我是一
  • 如何在 PyCharm 中运行 Flask shell?

    我在 PyCharm 中创建了新的 Flask 项目 但我看不到如何在集成的 PyCharm python 控制台窗口中运行 Flask shell Name app is not defined when start console 我仍
  • 将 RSA 加密参数从 CRT(中国剩余定理)映射到 .NET 格式

    我需要使用 C 实现 RSA 加密 解密 我有一个带有以下参数的私钥 mod n exponent p q dP dQ and p 1mod q 上述参数的解释见中文余数算法 然而 RSA 的 C NET 实现具有不同的参数集 如下所示 M
  • 使用 JavaScript 控制 Flash Player

    我希望能够在与 Flash 组件相同的页面中使用 JavaScript 控制 Flash 电影流 包括 播放和暂停流 改变流 我已经可以加载播放器并设置 flash 参数 但我不知道流开始后如何与播放器交互 是否可以在不修改当前用于播放电影
  • 电子“要求未定义”

    我正在制作一个应用程序 我需要授予对文件系统 fs 模块的访问权限 但是即使使用nodeIntegration启用渲染器给我这个错误 Uncaught ReferenceError require is not defined 我能找到的所