我正在使用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);
});
答案 0 :(得分:1)
您应该查看Async或任何一个受欢迎的承诺库(When.js,Q.js,Bluebird)。
任何这些都可以解决您的问题。在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
之后移动响应。这也可行。如果这解决了您的问题,请告诉我。