从回调中调用函数会导致节点应用挂起
Calling a function from within a callback causes node app to hang
我已经用实际代码更新了帖子。
问题是节点应用程序挂起并且不会退出,除非我在 addArticle 中注释掉查询。我想知道我在这里做错了什么(关于悬挂问题)。
function addArticle(title, text, date, link) {
connection.query("SELECT * FROM articles WHERE link LIKE "+connection.escape(link), function(error, rows, fields) {
if(rows.length == 0) {
console.log("article not in database");
console.log(connection.escape(title));
var values = [connection.escape(title), connection.escape(text), date, connection.escape(link), '{}'];
connection.query("INSERT INTO articles (title, text, date, link, topics) VALUES ?", [[values]], function(err) {
if(err) throw err;
});
}
});
}
function scrapeReuters() {
var url = 'http://www.reuters.com/news/archive/technologyNews?date=10092013';
request(url, function(err, resp, body){
$ = cheerio.load(body);
links = $('a');
$(links).each(function(i, link){
var addr = $(link).attr('href');
if(addr != undefined && addr.indexOf('article') != -1 && addr.indexOf('http') == -1 ) {
var full_link = "http://www.reuters.com"+addr;
var title = $(link).text();
request(full_link, function(err, resp, body){
$ = cheerio.load(body);
para = $('p').text();
addArticle(title, para,new Date().getTime(), full_link);
});
}
});
});
}
您可能需要在所有查询完成后关闭连接。可以尝试使用 https://github.com/caolan/async 库按顺序运行查询,然后在主回调中关闭连接。
这有点棘手,但首先你需要定义一个要执行的函数数组。然后运行 async.sequence(arrayOfFns,masterCallback)。主回调获取错误和结果(注意复数,它来自所有函数)。在该主回调中,终止 mysql 连接/和/或结束进程。
为此,我将重写 addArticle 查询以仅返回查询字符串。然后在你的$(links).each
循环之前,我会制作一个名为toInsert
的数组
在每个循环中,我会说
toInsert.push(function(callback) {
connection.query(addArticle(...),function(err) {
if(err) callback(err);
else callback(null,true);
});
});
然后在循环运行后
async.sequence(toInsert,function(errs,results) {
connection.close() //not sure if correct
process.exit(); //maybe, if needed?
});
相关文章:
- 获取docker容器中运行的节点应用程序的IP地址
- 只需添加一个'允许跨来源请求'到我的节点应用程序工作
- 节点应用程序无法识别功能
- 超级简单的节点应用程序,ä的问题ö等等字符
- 是否有离线词库?它应该可以通过节点应用程序进行搜索
- 如何使用 Restify 在同一端口上运行多节点应用程序
- 开发两个单独的节点应用程序来提供 Web 服务和使用 Web 服务以在浏览器上呈现它是一个好主意吗?
- 如何在节点应用程序中获取选定的下拉值
- 将节点应用程序中的表单数据重定向到 PHP 文件
- 如何在流打开时保持节点应用程序运行
- 无法在节点应用程序上获取/文件名错误
- Socket.io 两个节点应用程序
- 意外的输入结束 - 快速/节点应用程序上的 curl JSON
- 多变量是节点应用程序.js
- 从回调中调用函数会导致节点应用挂起
- 节点应用.js - 同步读取文件
- 将代理服务器(如 node-http-proxy )用于一个端口上具有单个应用程序的节点应用程序有什么意义
- 节点应用程序.js如何使用其推荐的功能
- 节点应用程序自动重新加载,自动编译咖啡脚本和自动编译更少的css
- 在我的机器上托管节点应用程序