如何将sqlite3更新与命令执行同步

时间:2015-04-23 13:48:43

标签: node.js express service sqlite

我正在使用NodeJS项目,我需要更新表,然后重新启动服务。不幸的是,服务在表更新之前重新启动。所以我认为这是一种正常的异步行为。

我如何同步?

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 个答案:

答案 0 :(得分:1)

您应该查看Async或任何一个受欢迎的承诺库(When.jsQ.jsBluebird)。

任何这些都可以解决您的问题。在Async中,使用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是同步的(看起来是这样)。

所有这些都说,看起来你的当前实现在完成所有db / restarting任务之前返回200。您可以尝试在exec之后移动响应。这也可行。如果这解决了您的问题,请告诉我。