2013-07-01 23 views
0

我只是在学习mongojs和nodejs,所以我仍然试图习惯编程异步。我的程序应该做的是从一个文件('list')获取输入,读取每行并将行传递给解析函数,该函数将数据写入文件并将数据写入数据库。终止在回调中的mongodb连接

这里是我的index.js:

var read_list = require('./read_list').read_list; 
var parse = require('./parse'); 
var databaseUrl = "mydb"; 
var collections = ["patents"] 
var db = require("mongojs").connect(databaseUrl, collections); 

read_list(filename, array, parse, database, function(err) { 
if(err) throw err; 
db.close(); 
}); 

read_list.js:

var fs = require('fs'); 
var tmp = "http://patft.uspto.gov/netacgi/nph-Parser?Sect1=PTO1&Sect2=HITOFF&d=PALL&p=1&u=%2Fnetahtml%2FPTO%2Fsrchnum.htm&r=1&f=G&l=50&s1=" 
function read_list(file_name, pat_array, parse, db) { 
fs.readFile(file_name, function(err, data) { 
    if(err) throw err; 
    else { 
     pat_array = data.toString().split("\n"); 
     for(var i = 0; i < pat_array.length; i++) { 
       parse(tmp+pat_array[i]+".PN.&OS=PN/"+pat_array[i]+"&RS=PN/"+pat_array[i], pat_array[i], db);   
     } 

    } 

}); 
} 
exports.read_list = read_list 

最后parse.js:

var fs = require('fs'); 
var cheerio = require('cheerio'); 
var request = require('request'); 
function parse(url, filename, db) { 
request(url, function(err, response, body) { 
    if (err) 
     throw err; 
    body = body.substring(body.indexOf("United States Patent", 43),  body.indexOf("* * * * *")); 
    $ = cheerio.load(body); 
    var elems = new Array(); 
    $("TD").each(function() { 
     if($(this).text()) 
     { 
      elems.push($(this).text().trim()); 
     } 
    }) 
    var pat_title = $("font").text().trim(); 
    var pat_abs = $("P").first().text().trim(); 
    var pat_num = elems[0]; 
    var pat_auth = elems[1]; 
    var pat_date = elems[2]; 

    var temp = "Title: " + pat_title + "\nNumber: " + pat_num + "\nAuthor: " +  pat_auth + "\nDate: " + pat_date + "\nAbstract: " + pat_abs; 

    db.patents.save(
    { 
     _id: filename.trim(), 
     Title: pat_title, 
     Number: pat_num, 
     Author: pat_auth, 
     Date: pat_date, 
     Abstract: pat_abs 
    }, 
    function(err, saved) 
    { 
     if(err || !saved) console.log("Patent not saved"); 
     else console.log("Patent saved"); 
    }); 

    fs.writeFile(filename.trim(), temp, function(err) { 
     if(err) { 
      console.log(err); 
     } else { 
      console.log("The file was saved!"); 
     } 
    }); 
}); 
} 

exports.parse = parse; 

希望这是有道理的,是可读的,我的第一篇文章。

一切都按我期望的那样执行,除了程序不会终止(必须用ctrl + c来完成)。我怎样才能改变程序,所以我可以在回调中关闭连接,或者我错过了这一点,并以错误的方式去做这件事?

回答

0

看起来像是在发生错误时调用db.close(),但在连接完成后不调用它。

虽然nodejs具有活动连接或正在等待端口/套接字上的连接,它仍将保持运行状态。

希望这会有所帮助!

+0

我意识到我的问题是什么。我需要在被调用的函数中有一个回调参数,然后在函数完成时调用它。尽管谢谢你的回答! – Monkeyulize