Mik*_*ike 5 javascript mongoose mongodb node.js express
我正在学习节点,表达,mongo,以及在此过程中,javascript.我正在尝试使用rssparser获取一个功能,获取故事列表并将其保存到mongoose的mongo数据库中.
我已经完成了RSS工作,而且我正在重复这些故事,这是我遇到问题的拯救.我想1)检查数据库中是否存在故事,2)如果没有,请保存.我想我在处理回调的过程中迷失了方向.这是我当前的代码,带有注释.
rssparser.parseURL(url, options, function(err,out){
// out.items is an array of the items pulled
var items = out.items;
var story;
for (var i=0; i<items.length; i++){
//create a mongoose story
story = new schemas.Stories({
title: items[i].title,
url: items[i].url,
summary: items[i].summary,
published: items[i].published_at
});
//TODO: for testing - these show up correctly.
//If I pull 10 stories, I get 10 entries from here that match
//So "story" is holding the current story
console.log("items[i] is :" + items[i].title);
console.log("story title is : " + story.title);
// setup query to see if it's already in db
var query = schemas.Stories.findOne({
"title" : story.title,
"url" : story.url
});
//execute the query
query.exec( function(err, row){
if(err) console.log("error-query: " + err);
console.log("row: "+ row);
if(!row) {
// not there, so save
console.log('about to save story.title: ' + story.title);
story.save(function (err){
console.log("error in save: " + err);
});
}
});
}
});
Run Code Online (Sandbox Code Playgroud)
当这个运行时,我看到的是很多控制台输出:
它开始显示所有故事(许多省略):
items[i] is :TSA Drops Plan to Let Passengers Carry Small Knives on Planes
story title is : TSA Drops Plan to Let Passengers Carry Small Knives on Planes
items[i] is :BUILDING COLLAPSE:1 Reportedly Dead, 13 Pulled From Philly Rubble
story title is : BUILDING COLLAPSE:1 Reportedly Dead, 13 Pulled From Philly Rubble
items[i] is :CONTROVERSIAL PAST: Obama's UN Nominee Once Likened US 'Sins' to Nazis'
story title is : CONTROVERSIAL PAST: Obama's UN Nominee Once Likened US 'Sins' to Nazis'
items[i] is :WRITING OUT WRIGHTS: Bill Gives First Powered Flight Nod to Whitehead
story title is : WRITING OUT WRIGHTS: Bill Gives First Powered Flight Nod to Whitehead
items[i] is :BREAKING NEWS: Rice Named to Top Security Post Despite Libya Fallout
story title is : BREAKING NEWS: Rice Named to Top Security Post Despite Libya Fallout
Run Code Online (Sandbox Code Playgroud)
然后继续像(许多省略):
row: null
about to save story.title: Best Ribs in America
row: null
about to save story.title: Best Ribs in America
row: null
about to save story.title: Best Ribs in America
row: null
about to save story.title: Best Ribs in America
row: null
about to save story.title: Best Ribs in America
row: null
about to save story.title: Best Ribs in America
row: { title: 'Best Ribs in America',
url: 'http://www.foxnews.com/leisure/2013/06/05/10-best-ribs-in-america/',
published: 1370463800000,
_id: 51af9f881995d40425000023,
__v: 0 }
Run Code Online (Sandbox Code Playgroud)
它重复了"即将保存"标题(这是Feed中的最后一个故事),并且它保存了一次故事,就像最后一行所示.
console.log输出显示我把它,所有的故事标题输出在顶部,然后从底部的query.exec()调用内的所有东西.
任何帮助表示赞赏......
这样做的问题是,一旦执行回调,exec 回调中引用的故事将被设置为 for 循环中最后迭代的内容,因为所有执行的函数都引用该函数的同一个实例。多变的。
解决此问题的最简单方法是简单地将 for 循环中的每个内容包装在您立即使用参数执行的函数中,如下所示:
rssparser.parseURL(url, options, function(err,out){
// out.items is an array of the items pulled
var items = out.items;
for (var i=0; i<items.length; i++){
(function(item) {
//create a mongoose story
var story = new schemas.Stories({
title: item.title,
url: item.url,
summary: item.summary,
published: item.published_at
});
// setup query to see if it's already in db
var query = schemas.Stories.findOne({
"title" : story.title,
"url" : story.url
});
//execute the query
query.exec( function(err, row){
if(err) console.log("error-query: " + err);
console.log("row: "+ row);
if(!row) {
// not there, so save
console.log('about to save story.title: ' + story.title);
story.save(function (err){
console.log("error in save: " + err);
});
}
});
})(items[i]);
}
});
Run Code Online (Sandbox Code Playgroud)
我还没有测试过这个,但我相信你会发现它可以解决你的问题
另一种更简单、更干净、更好的方法是迭代数组上的 forEach 循环中的项目,如果您的平台支持(node.js 支持)——这个版本更漂亮:
rssparser.parseURL(url, options, function(err,out){
// out.items is an array of the items pulled
out.items.forEach(function(item) {
//create a mongoose story
var story = new schemas.Stories({
title: item.title,
url: item.url,
summary: item.summary,
published: item.published_at
});
// setup query to see if it's already in db
var query = schemas.Stories.findOne({
"title" : story.title,
"url" : story.url
});
//execute the query
query.exec( function(err, row){
if(err) console.log("error-query: " + err);
console.log("row: "+ row);
if(!row) {
// not there, so save
console.log('about to save story.title: ' + story.title);
story.save(function (err){
console.log("error in save: " + err);
});
}
});
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2073 次 |
| 最近记录: |