我正在尝试将 Sqlite3 数据库中的数据插入到由 Beaglebone black 托管的网页中。 使用 Java Script Web Worker 形成一个在线示例来进行数字计数,JS Worker 和 HTML 页面工作正常。如果我修改工作程序代码以从数据库获取数据,并在主机上的终端中运行它,也可以正常工作,访问数据库并打印出数据。但是,该代码不会作为工作人员运行。 HTML 代码 (wkr_tst.html)
<html>
<body>
<p>Count numbers: <output id="result"></output></p>
<p>Count numbers: <output id="result2"></output></p>
<button onclick="startWorker()">Start Worker</button>
<button onclick="stopWorker()">Stop Worker</button>
<script>
var w;
function startWorker() {
if (typeof(Worker) !== "undefined") {
if (typeof(w) == "undefined") {
w = new Worker("dbase1.js");
}
w.onmessage = function(event) {
document.getElementById("result").innerHTML = event.data;
document.getElementById("result2").innerHTML = event.data;
};
} else {
document.getElementById("result").innerHTML = "Sorry! No Web Worker support.";
}
}
function stopWorker() {
w.terminate();
w = undefined;
}
</script>
</body>
</html>
Java 脚本工作者:(dbase1.js)
const sqlite3 = require("sqlite3")
var i = 0;
const db = new sqlite3.Database("/home/debian/examples/C_BMS/test2.db",sqlite3.OPEN_READONLY );
function timedCount() {
i=i+1;
db.all("SELECT * FROM EpiData", [], (err, rows) => {
console.log(rows);
})
postMessage(rows);
//postMessage(i);
//postMessage(i+2);
//setTimeout("timedCount()",500);
}
timedCount();
db.close();
使用2个不同的浏览器,使用inspect函数,都显示“require(Sqlite3)函数未定义。
我尝试重新安装 Nodejs 和 sqlite3 扩展,结果相同。
在浏览器中运行的
JS
中的 Web Workers 无权访问 require("sqlite3")
,因为它是一个 Nodejs
模块。
我建议你
separate client side (Web Worker) from server side (Nodejs)
。
以下是您可以执行的操作的示例:
1。服务器端代码(Nodejs)
const express = require('express');
const sqlite3 = require('sqlite3').verbose();
const app = express();
const port = 3000; //you can change this port to whatever port you want
const db = new sqlite3.Database('/home/debian/examples/C_BMS/test2.db', sqlite3.OPEN_READONLY);
//make an endpoint to fetch data
app.get('/data', (req, res) => {
db.all("SELECT * FROM EpiData", [], (err, rows) => {
if (err) {
res.status(500).json({ error: err.message });
return;
}
res.json(rows);
});
});
app.listen(port, () => {
console.log(`Listening on port ${port}`);
});
2。 Web Worker (dbase1.js)
function timedCount() {
fetch('/data')
.then(response => response.json())
.then(data => {
postMessage(data); //send data back to the main thread
})
.catch(error => {
console.error(error);
postMessage('Error fetching data');
});
}
timedCount();
3. wkr_tst.html
<html>
<body>
<p>Count numbers: <output id="result"></output></p>
<p>Count numbers: <output id="result2"></output></p>
<button onclick="startWorker()">Start Worker</button>
<button onclick="stopWorker()">Stop Worker</button>
<script>
var w;
function startWorker() {
if (typeof(Worker) !== "undefined") {
if (typeof(w) == "undefined") {
w = new Worker("dbase1.js");
}
w.onmessage = function(event) {
document.getElementById("result").innerHTML = JSON.stringify(event.data, null, 2);
document.getElementById("result2").innerHTML = JSON.stringify(event.data, null, 2);
};
} else {
document.getElementById("result").innerHTML = "Sorry! No Web Worker support.";
}
}
function stopWorker() {
w.terminate();
w = undefined;
}
</script>
</body>
</html>
注意: 确保您的
frontend
(HTML)和backend
(Nodejs)都在BeagleBone Black
上运行,并且它们通过Web服务器或nodejs服务器提供服务,也许您还必须启用cors
(在 Nodejs 代码中)。或者您也可以使用 Express 提供静态 HTML 文件。
app.use(express.static('path to your html file'));
希望这对您有帮助。