首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJS - sqlite3,数据同步

NodeJS - sqlite3,数据同步
EN

Stack Overflow用户
提问于 2014-07-07 13:56:29
回答 1查看 2.4K关注 0票数 3

我正在尝试写一个简单的应用程序与nodejs,socket.io和sqlite作为一个数据库。目前,这主要是为了培训目的,以了解nodejs是如何工作的,并看看它是否适合其他项目。

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

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

但是如果页面被刷新,颜色就会消失(似乎我需要刷新页面才能看到数据库中的更新值)。

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

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

app.js

代码语言:javascript
复制
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'));
});

Client.js:

代码语言:javascript
复制
$(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:

代码语言:javascript
复制
<!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:

代码语言:javascript
复制
#!/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()
EN

回答 1

Stack Overflow用户

发布于 2017-01-27 15:44:08

据我所知,Sqlite模块是为“内存数据库”设计的,所以当你写任何INSERT语句时,它不会被提交,直到你把它写到磁盘上。

我正在使用电子和sql.js (sqlite3节点在电子中不工作),我找到的唯一解决方案是运行查询(Insert...),导出db (sql.js具有db.export()方法),然后使用文件系统覆盖文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24603845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档