Nodejs SQL 连接和异步模块
Nodejs SQL connections and async module
我一直在玩 Node.JS,我发现了这个很棒的异步库 https://github.com/caolan/async。我想用这个代替传统的回调模型,因为它看起来更讨人喜欢也更容易理解。
这是我用于 sql 查询的代码
function query_mssql(config, sql_string){
var connection = new sql.Connection(config, function(err) {
// ... error checks
if (err) {
console.log('connection to mssql has failed');
//throw err;
}else{
// Query
var request = new sql.Request(connection); // or: var request = connection.request();
request.query(sql_string, function(err, recordset) {
// ... error checks should go here :
// output query result to console:
console.log(recordset);
return recordset;
});
}
});
}
我想知道如何使这个异步,就像库中给出的示例一样。
async.series([
function(callback){
// do some stuff ...
callback(null, 'one');
},
function(callback){
// do some more stuff ...
callback(null, 'two');
}
],
// optional callback
function(err, results){
// results is now equal to ['one', 'two']
});
有人可以帮我解决这个问题吗?我不太明白错误报告是如何工作的。
根据 Chris 的评论,如果在多层中调用瀑布方法究竟有何帮助?
function computeCurrentDefinitionResult(database, node_name) {
async.waterfall([
function(callback) {
var leaf_sql_query = "SELECT * FROM "+ JSON.stringify(database) +".dbo.LeafNode WHERE NodeName=" + "'" + node_name + "'";
query_mssql_internal(leaf_sql_query, callback);
console.log('Might BE HAPPY');
},
], function(err, recordset) {
// ... error checks should go here :
if (err) {
console.log('mssql query has failed');
}
// output query result to console:
console.log(recordset);
return recordset;
});
function query_mssql_internal(sql_string){
return query_mssql(config, sql_string);
}
"query_mssql()" 调用您的函数。如何将结果传递回顶部调用函数或返回错误?
为此,我认为您应该使用 async.waterfall,因为您希望在每个异步任务中传递结果。
下面是一个简单的例子。您必须对其进行编辑以满足您的需要。
如果任务中发生错误,它将移出到最后的可选方法。
async.waterfall([
function(callback) {
var connection = new sql.Connection(config,
function(err) {
callback(err, connection)
}
);
},
function(connection, callback) {
var request = connection.request();
request.query(sql_string, callback);
}
], function(err, recordset) {
// ... error checks should go here :
// output query result to console:
console.log(recordset);
});
如您所见,您可以在回调错误后添加参数,然后在下一个任务中接收它们。这是async.waterfall的一个特点。
这里也有一个测试例子...
require("should");
var async = require("async");
describe("async test", function() {
it('should do stuff', function(done){
async.waterfall([
function(callback){
a(callback);
},
function(aResult, callback){
b(callback, aResult);
}
], function(err, aResult, bResult) {
console.log(aResult + " " + bResult);
done();
});
function a(callback) {
callback(null, 1);
}
function b(callback, aResult) {
callback(null, aResult, 2);
}
})
});
至于上次编辑,您必须 return 异步输入您的值。因此,您不能使用 return 语句来获取结果。这会产生涓流效应,导致这些依赖项也变得异步。
我一直在玩 Node.JS,我发现了这个很棒的异步库 https://github.com/caolan/async。我想用这个代替传统的回调模型,因为它看起来更讨人喜欢也更容易理解。
这是我用于 sql 查询的代码
function query_mssql(config, sql_string){
var connection = new sql.Connection(config, function(err) {
// ... error checks
if (err) {
console.log('connection to mssql has failed');
//throw err;
}else{
// Query
var request = new sql.Request(connection); // or: var request = connection.request();
request.query(sql_string, function(err, recordset) {
// ... error checks should go here :
// output query result to console:
console.log(recordset);
return recordset;
});
}
}); }
我想知道如何使这个异步,就像库中给出的示例一样。
async.series([
function(callback){
// do some stuff ...
callback(null, 'one');
},
function(callback){
// do some more stuff ...
callback(null, 'two');
}
],
// optional callback
function(err, results){
// results is now equal to ['one', 'two']
});
有人可以帮我解决这个问题吗?我不太明白错误报告是如何工作的。
根据 Chris 的评论,如果在多层中调用瀑布方法究竟有何帮助?
function computeCurrentDefinitionResult(database, node_name) {
async.waterfall([
function(callback) {
var leaf_sql_query = "SELECT * FROM "+ JSON.stringify(database) +".dbo.LeafNode WHERE NodeName=" + "'" + node_name + "'";
query_mssql_internal(leaf_sql_query, callback);
console.log('Might BE HAPPY');
},
], function(err, recordset) {
// ... error checks should go here :
if (err) {
console.log('mssql query has failed');
}
// output query result to console:
console.log(recordset);
return recordset;
});
function query_mssql_internal(sql_string){
return query_mssql(config, sql_string);
}
"query_mssql()" 调用您的函数。如何将结果传递回顶部调用函数或返回错误?
为此,我认为您应该使用 async.waterfall,因为您希望在每个异步任务中传递结果。
下面是一个简单的例子。您必须对其进行编辑以满足您的需要。
如果任务中发生错误,它将移出到最后的可选方法。
async.waterfall([
function(callback) {
var connection = new sql.Connection(config,
function(err) {
callback(err, connection)
}
);
},
function(connection, callback) {
var request = connection.request();
request.query(sql_string, callback);
}
], function(err, recordset) {
// ... error checks should go here :
// output query result to console:
console.log(recordset);
});
如您所见,您可以在回调错误后添加参数,然后在下一个任务中接收它们。这是async.waterfall的一个特点。
这里也有一个测试例子...
require("should");
var async = require("async");
describe("async test", function() {
it('should do stuff', function(done){
async.waterfall([
function(callback){
a(callback);
},
function(aResult, callback){
b(callback, aResult);
}
], function(err, aResult, bResult) {
console.log(aResult + " " + bResult);
done();
});
function a(callback) {
callback(null, 1);
}
function b(callback, aResult) {
callback(null, aResult, 2);
}
})
});
至于上次编辑,您必须 return 异步输入您的值。因此,您不能使用 return 语句来获取结果。这会产生涓流效应,导致这些依赖项也变得异步。