NodeJS 操作顺序
Posted
技术标签:
【中文标题】NodeJS 操作顺序【英文标题】:NodeJS Order Of Operations 【发布时间】:2013-10-22 21:28:25 【问题描述】:我正在尝试创建一个 NodeJS 应用程序来提取 SQL 记录并将它们插入 MongoDB。我感兴趣的表有点大(超过 100 万条记录)。对于小型数据集(
看起来 Node 正在运行我的“for”循环,为每个 SQL 子选择分支进程,然后运行 MongoDB 更新。
我从未见过“Mongo Connected!”直到最后一个“Getting Responses for Activity #”被写入屏幕。
#!/var/node/bin/node
var odbc = require("odbc");
var db = new odbc.Database();
var MongoClient = require('mongodb').MongoClient;
var format = require('util').format;
db.open("DSN=<DSN>;SERVER=<SERVER>;DATABASE=<DB>;UID=<UID>;PWD=<PWD>", function (err)
if(err) throw err;
console.log("SQL Connected!");
var sqlstr = "SELECT TOP 1000 * FROM tbl_A NOLOCK";
console.log("Executing '" + sqlstr + "' against SQL Server");
db.query(sqlstr, function (sql1err, rows, moreResults)
if (sql1err) throw sql1err;
for (var i = 0; i < rows.length; i++)
InsertActivity(db, rows[i], i, rows.length, function () );
);
);
function InsertActivity(sql, activity, cur, total, callback)
console.log("Getting Responses for Activity #" + activity.ActivityID);
var rsql = "SELECT * FROM tbl_Responses NOLOCK WHERE ActivityID = " + activity.ActivityID;
sql.query(rsql, function (sqlerr, rows, moreResults)
if (sqlerr) console.log(sqlerr);
activity.resonses = rows;
MongoClient.connect('mongodb://localhost:27017/m', function (merr, mdb)
console.log("Mongo Connected!");
mdb.collection("activity").insert(activity, function ()
console.log("Inserted Activity #" + activity.ActivityID + " inserted into Mongo");
mdb.close(function () console.log("Mongo Disconnected!"); );
callback();
);
);
if (cur == total - 1) sql.close(function () console.log("SQL Disconnected!"); );
);
console.log(rsql);
【问题讨论】:
【参考方案1】:不幸的是,您需要的是一个未记录的函数(我会修复它)。该函数是db.queryResult
,它返回允许您单独获取行的结果对象。这将避免将整个结果集缓冲到内存中。
https://github.com/wankdanker/node-odbc/blob/master/test/test-query-select-fetch.js
var db = require('odbc')();
db.open(connectionString, function (err)
db.queryResult('select * from tbl_A NOLOCK', function (err, result)
fetchMore();
function fetchMore()
result.fetch(function (err, data)
if (!data)
//we're all done, clean up
doStuffWithData(data, function (err)
fetchMore();
);
);
);
);
function doStuffWithData(data, cb)
//do stuff
cb(null);
【讨论】:
以上是关于NodeJS 操作顺序的主要内容,如果未能解决你的问题,请参考以下文章
NodeJS,Async forEachSeries 执行顺序
NodeJS,Async forEachSeries 执行顺序