从 JavaScript Web Worker 打开 Sqlite3 数据库时出现问题

问题描述 投票:0回答:1

我正在尝试将 Sqlite3 数据库中的数据插入到由 Beaglebone black 托管的网页中。 使用 JavaScript Web Worker 形成一个在线示例来进行数字计数,JS Worker 和 HTML 页面工作正常。如果我修改工作程序代码以从数据库获取数据,并在主机上的终端中运行它,也可以正常工作,访问数据库并打印出数据。但是,该代码不会作为工作人员运行。 HTML 代码 (wkr_tst.html)

<!DOCTYPE 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> 

JavaScript 工作者:(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)函数未定义。

我尝试重新安装 Node.js 和 sqlite3 扩展,结果相同。

javascript sqlite web-worker
1个回答
0
投票

在浏览器中运行的

JS
中的 Web Workers 无权访问
require("sqlite3")
,因为它是一个
Nodejs
模块。

我建议你

separate client side (Web Worker) from server side (Nodejs)

以下是您可以执行的操作的示例:

1。服务器端代码(Nodejs)

  • 安装cors,
    npm install --save cors
    yarn add cors

const express = require('express');
const cors = require('cors');
const sqlite3 = require('sqlite3').verbose();
const app = express();

app.use(cors()); //this enables cors for everyone, first try this and check if your code works
/*
do this if you only want specific address to have access to the route
app.use(cors({
    origin: 'http://192.168.0.52',  //replace with the actual frontend URL
    optionsSuccessStatus: 200
}));
*/
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('http://<your-server-ip>:3050/data') // changed this line from `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'));

希望这对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.