JavaCake
JavaCake

Reputation: 4115

How to synchronize sqlite3 update with command execution

I am working with a NodeJS project where i need to update a table and afterwards restart a service. Unfortunately the service restarts before the table has been updated. So i assume this is a normal async behaviour.

How do i synchronize this?

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);
});

Upvotes: 0

Views: 789

Answers (1)

Brennan
Brennan

Reputation: 1785

You should check out Async or any one of the popular promise libraries (When.js, Q.js, Bluebird).

Any of these should solve your problem. In Async it might look something like this using 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);
    }
  );
});

This assumes db.run is synchronous (it looks like it is).

All this said, it looks like your current implementation was returning 200 before it finished all the db/restarting tasks. You might try moving the response after the exec. That may also work. Let me know if this solves your issue.

Upvotes: 1

Related Questions