Skip to content

Instantly share code, notes, and snippets.

@ybogdanov
Created August 30, 2011 15:23
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ybogdanov/1181153 to your computer and use it in GitHub Desktop.
Save ybogdanov/1181153 to your computer and use it in GitHub Desktop.
how to use node-sync in express-middleware style with mysql transactions
// Заюзай node-sync v0.1.9beta2, в ней есть .asyncMiddleware()
// это маленькая магия, которая позволяет писать "синхронные" функции типа function(req, res, next)
// еще не знаю, как ее лучше назвать...
app.post('/q/register', function(req, res) {
var mysql = database.spawnConnection();
// А можно реализацию beginSync?
mysql.beginSync();
// Если тут где-то вылетит эксепшн, то роллбэк надо тоже
var result;
try {
var distributor = new PendingDistributor();
distributor.setFullName(req.param('fullName'));
distributor.setNickname(req.param('nickname'));
// внутри этого метода я вызываю mysql.query.sync(mysql, "INSERT ....
result = distributor.createSync(mysql, req.param('password'));
if (!result.success) {
throw new Error('Cannot create distributor');
}
mysql.commitSync();
}
catch (err) {
// а как мне здесь стек трейс получить?
// -- а никак, в том числе и в классической асинхронной реализации.. но я над этим работаю
console.log("Oops: "+err);
mysql.rollbackSync();
result = {
success: false,
msg: "Cannot create distributor"
}
}
res.send(result);
mysql.end.sync(mysql);
// если функция .asyncMiddleware() возвращает true, next() не будет вызван
return true;
}.asyncMiddleware()); // <-- вот это маленькая магия
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment