我已经安装了Electron和MySql,并且让它们很好的配合。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Hello world</h1>
</body>
<script>
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'blog'
});
connection.connect();
connection.query('SELECT * FROM posts', function (error, results, fields) {
if (error) throw error;
console.log(results);
});
connection.end();
</script>
</html>
然后在窗口中我得到一个安全错误。
index.html:16 Uncaught ReferenceError: require is not defined.
我注意到,我可以像下面这样覆盖它。
win = new BrowserWindow({
webPreferences: {
nodeIntegration: true
}
});
我读过这很危险,不建议这么做?当我这样做的时候,我也得到了一个警告。
Electron Security Warning (Insecure Content-Security-Policy) 这个渲染器进程要么没有设置内容安全策略,要么是启用了 "unsafe-eval "的策略。这将使该应用程序的用户面临不必要的安全风险。
我怎样才能解决这个问题?
你在这里遇到的是Electron的开箱即用的沙盒。这可以防止你的渲染器进程,也就是执行你的用户界面HTML和JavaScript的地方,能够访问NodeJS的API,这样就不会有恶意代码真正对用户的电脑造成伤害。正如您所说,您可以通过设置 nodeIntegration: true
但Electron的开发者认为这不是一个好的做法。
然而,如果你不能使用一些变通的方法(例如使用 preload
脚本;请参考Electron文档,特别是关于 本教程关于上下文隔离),为了消除这个警告(其实并没有什么坏处,因为它不会在应用程序打包时显示),你可以在你的主进程中设置一个环境变量,就像这样(最好是在第一行)。
process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = true;
// Other main process code...
虽然这样做会删除警告,但我还是会把它留在原处,这样它就能提醒你的安全职责,并在应用达到生产就绪状态后重新审视你的代码,使其符合Electron的安全准则。
使用一个预加载脚本来代替,并把你的MySQL连接代码放在里面。预加载脚本可以访问要求节点集成,也可以同时访问内容窗口。你可以让预加载脚本添加到全局窗口对象中,暴露出连接和执行sql查询的功能。