2015-04-23 26 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