gpt4 book ai didi

node.js - NodeJS - sqlite3,数据同步

转载 作者:搜寻专家 更新时间:2023-11-01 00:08:09 35 4
gpt4 key购买 nike

我正在尝试使用 nodejs、socket.io 和 sqlite 作为数据库编写一个简单的应用程序。目前这主要用于培训目的,了解 nodejs 的工作原理,看看它是否适合另一个项目。

该应用程序是一个只有一个按钮的简单页面。数据库用于存储按钮的状态(开/关)。//这是一个要求,因为这个数据库可以被其他服务访问基本上,该页面显示当前状态(数据库中的最后一条记录)单击该按钮时,状态会更改,并且新状态会添加到数据库中。这似乎有效并且数据库已更新。

现在,我想通过使用按钮的颜色来显示当前状态,使这些更改可视化。例如,关闭时为蓝色,打开时为红色。我尝试使用 socket.io 来处理点击事件,似乎我可以在点击按钮时更改按钮的颜色。

但是如果刷新页面颜色就消失了(看来我需要刷新页面才能看到数据库中更新的值)

如何使页面内容(显示的数据和按钮的颜色)与数据库保持同步?

我希望有人能指出我正确的方向。谢谢,

应用程序.js

var express = require('express');
var sqlite3 = require('sqlite3').verbose();
var http = require('http');
var path = require('path');
var mainDB = 'data/mydb';
var hbs = require('hbs');

var app = express();
//all environments
app.set('port', 3000);
app.set('view engine', 'html');
app.engine('html', hbs.__express);
app.use(express.bodyParser());
app.use(express.static(path.join(__dirname, 'public')));

function getStatus(database, callback){
var db = new sqlite3.Database(database);
// Get the last record
db.get("SELECT * FROM status ORDER BY id DESC LIMIT 1", function(err, all) {
console.log("Current status..."+all.status);
callback(err, all);
});
db.close();
}
function setStatus(database, status){
console.log("Set Status..."+status);
var db = new sqlite3.Database(database);
db.run("INSERT INTO status(status, time) VALUES(?,?)", status, Date.now());
db.close();
}

app.get('/', function(req, res) {
getStatus(mainDB,function(err, json_value) {
res.render('index',{title:"Test", status:json_value.status,time:json_value.time});
});

});


var server = http.createServer(app);
var io = require('socket.io').listen(server);

io.sockets.on('connection', function(socket){
socket.on('click', function(htmlID){
getStatus(mainDB,function(err, json_value) {
console.log("Button clicked, current status: "+json_value.status)
setStatus(mainDB, !json_value.status);
io.sockets.emit('updateButton',htmlID);
});
});

});

server.listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});

客户端.js:

$(document).ready(function () {

var socket = io.connect();

$('.box').click(function () {
var selectedID = $(this).attr("id");
socket.emit('click', selectedID);
updateButton(selectedID);
});


function updateButton(selectedID) {
$("#" + selectedID).css({
"background": "red"
});
}

socket.on('updateButton', function (selectedID) {
updateButton(selectedID);
});
});

views/index.html:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="css/style.css">
<script src="js/jquery.min.js"></script>
<script src="js/client.js"></script>
<script src="/socket.io/socket.io.js"></script>
</head>
<body>
<div class="container">
<h1>{{title}}</h1>
<p>Status: {{status}}</p>
<p>Time: {{time}}</p>
<div class="box" id="alarm">{{status}}</div>
</div>
</body>
</html>

创建虚拟数据库的 .py:

#!/usr/bin/env python
from datetime import date, datetime
import sqlite3
import time

tables = {
'status' : '''
CREATE TABLE status(id INTEGER PRIMARY KEY,
status INTEGER,
time TIMESTAMP)
'''
}

def create_db():
db = sqlite3.connect("data/mydb")
with db:
cursor = db.cursor()
for tb_name, create_statement in tables.iteritems():
cursor.execute('drop table if exists %s'%tb_name)
print "Creating table : %s"%tb_name
cursor.execute(create_statement)
db.commit()

# fake up some data
status = 0
for i in range(10):
status = not status
default_values = [status, datetime.now() ]
cursor.execute('INSERT INTO status(status, time) values(?,?)', default_values)
time.sleep(0.5)
db.commit()
db.close()

if __name__ == "__main__":
create_db()

最佳答案

据我所知,Sqlite 模块是为“内存数据库”制作的,因此当您编写任何 INSERT 语句时,只有将其写入磁盘后才会提交。

我正在使用 electron 和 sql.js(sqlite3 Node 不能在 electron 中工作)我找到的唯一解决方案是运行查询(插入 ...),导出数据库(sql.js 具有 db.export() 方法),然后使用文件系统覆盖文件。

关于node.js - NodeJS - sqlite3,数据同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24603845/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com