2015-04-23 50 views
0

我正在與一個NodeJS項目,我需要更新一個表,然後重新啓動服務。不幸的是,該服務在表更新之前重新啓動。所以我認爲這是一個正常的異步行爲。如何同步sqlite3更新與命令執行

我該如何同步這個?

var sqlite3 = require('sqlite3').verbose(); 
var express = require('express'); 
var app = express(); 
var router = express.Router(); 
var db = new sqlite3.Database('/home/test/testApp.db', 'OPEN_READWRITE'); 

router.route('/') 
.get(function(req, res) { 
    res.render('index', { data: dbConfigRow }); 
}) 
.post(function(req, res) { 
    // console.log(req.body); 
    db.serialize(function() { 
     for (var key in req.body) { 
      db.run("UPDATE config SET " + key + "='" + req.body[key] + "'"); 
     } 
     exec('systemctl restart demoApp'); 
    }); 
    res.json(200); 
}); 

回答

1

你應該檢查Async或流行的諾言庫(When.jsQ.jsBluebird)中的任何一個。

任何這些應該可以解決您的問題。在異步它可能看起來像這樣使用series

.post(function(req, res) { 
    async.series([ 
    function(callback){ 
     db.serialize(function() { 
     for (var key in req.body) { 
      db.run("UPDATE config SET " + key + "='" + req.body[key] + "'"); 
     } 
     callback() 
     }) 
    }, 
    function(callback){ 
     exec('systemctl restart demoApp'); //Assuming this is synchronous 
     callback() 
    } 
    ], 
    function(error, results){ //Using the optional callback 
     res.send(200); 
    } 
); 
}); 

這是假定db.run是同步的(它看起來是)。

所有這一切說,它看起來像你當前的實現返回200之前,它完成所有數據庫/重新啓動任務。您可以嘗試在exec之後移動回覆。這也可能奏效。讓我知道這是否解決了你的問題。

+0

工程就像一個魅力! 'db.serialize'函數的末尾缺少圓括號,除了一切正常。 – JavaCake

+0

啊,錯過了,謝謝!我編輯了我的答案以包含括號。如果您發現我的答案解決了您的問題,請接受它。否則,讓我知道我是否可以幫助其他任何事情! – Brennan