0

我只是在学习 mongojs 和 nodejs,所以我仍在尝试习惯异步编程。我的程序应该做的是从文件(“列表”)中获取输入,读取每一行并将该行传递给解析函数,该函数将数据写入文件并将数据写入数据库。

这是我的 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 来完成)。如何更改程序以便我可以在回调中关闭连接,或者我是否错过了重点并以错误的方式进行此操作?

4

1 回答 1

0

如果发生错误,您似乎会调用 db.close() 但在完成连接后您不会调用它。

当 nodejs 有活动连接或正在等待端口/套接字上的连接时,它将保持运行。

希望这可以帮助!

于 2013-07-01T22:03:30.877 回答