我試圖通過我有的「事件」數據庫工作,並根據每個事件的位置,半徑,開始時間和結束時間從Instagram API中提取照片。我在我的Node服務器上設置了下面的代碼,但它不像我期望的那樣運行。如何正確構造異步節點代碼
我運行此代碼時看到的第一件事情是爲每個事件打印sending request to Instagram for [name] with min_timestamp: [timestamp]
。我沒有想到這一點。我預計會看到這行記錄的第一個事件,然後更新一個新的時間戳,直到該事件達到其結束時間。然後事件2,遍歷時間戳,等等。
我結束了每個事件反覆重複的同一塊照片。就好像我的代碼一遍又一遍地向Instagram發出一個請求(帶有初始時間戳),然後停止。
關於我的時間戳變量的注意事項:對於每個事件,我將我的minTimestamp變量設置爲初始等於我的數據庫中的event.start
。這是在發送給Instagram的請求中使用的。 Instagram會返回20張照片給我。每張照片都有一個created_time變量。我抓取最近的created_time變量,並將我的minTimestamp變量設置爲等於它(minTimestamp = images[0].created_time;
),以便發送給Instagram的下一個請求(抓取接下來的20張照片)。這一直持續到MinTimestamp不再小於endTimestamp(從我的db中爲該事件的event.end
)。
server.js代碼:
// modules =================================================
var express = require('express.io');
var app = express();
var port = process.env.PORT || 6060;
var io = require('socket.io').listen(app.listen(port));
var request = require('request');
var Instagram = require('instagram-node-lib');
var mongoose = require('mongoose');
var async = require('async');
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
var db = require('./config/db');
var Event = require('./app/models/event');
// configuration ===========================================
mongoose.connect(db.url); // connect to our mongoDB database
// get all data/stuff of the body (POST) parameters
app.use(bodyParser.json()); // parse application/json
app.use(bodyParser.json({ type: 'application/vnd.api+json' })); // parse application/vnd.api+json as json
app.use(bodyParser.urlencoded({ extended: true })); // parse application/x-www-form- urlencoded
app.use(methodOverride('X-HTTP-Method-Override')); // override with the X-HTTP-Method- Override header in the request. simulate DELETE/PUT
app.use(express.static(__dirname + '/public')); // set the static files location /public/img will be /img for users
var baseUrl = 'https://api.instagram.com/v1/media/search?lat=';
var clientId = CLIENT-ID;
Event.find({}, function(err, events) {
async.eachSeries(events, function(event, callback) {
var name = event.event;
var latitude = event.latitude;
var longitude = event.longitude;
var distance = event.radius;
var minTimestamp = Math.floor(new Date(event.start).getTime()/1000);
var endTimestamp = Math.floor(new Date(event.end).getTime()/1000);
async.whilst(
function() { return minTimestamp < Math.floor(Date.now()/1000) && minTimestamp < endTimestamp; },
function(callback) {
console.log('sending request to Instagram for ' + name + ' with min_timestamp: ' + minTimestamp);
request(baseUrl + latitude + '&lng=' + longitude + '&distance=' + distance + '&min_timestamp=' + minTimestamp + '&client_id=' + clientId,
function (error, response, body) {
if (error) {
console.log('error');
return;
}
//JSON object with all the info about the image
var imageJson = JSON.parse(body);
var images = imageJson.data;
var numImages = images.length;
console.log(numImages + ' images returned with starting time ' + images[(numImages - 1)].created_time + ' and ending time ' + images[0].created_time);
async.eachSeries(images, function(image, callback) {
//Save the new object to DB
Event.findOneAndUpdate({ $and: [{latitude: latitude}, {radius: distance}] }, { $push: {'photos':
{ img: image.images.standard_resolution.url,
link: image.link,
username: image.user.username,
profile: image.user.profile_picture,
text: image.caption ? image.caption.text : '',
longitude: image.location.longitude,
latitude: image.location.latitude
}}},
{ safe: true, upsert: false },
function(err, model) {
console.log(err);
}
);
console.log(numImages + ' images saved to db');
callback();
}, function(err){
// if any of the file processing produced an error, err would equal that error
if(err) {
// One of the iterations produced an error.
// All processing will now stop.
console.log('Images failed to process');
} else {
console.log('All images have been processed successfully');
}
});
minTimestamp = images[0].created_time;
console.log('min_timestamp incremented to: ' + minTimestamp);
}
);
},
function (err) {
}
);
callback();
}, function(err){
// if any of the file processing produced an error, err would equal that error
if(err) {
// One of the iterations produced an error.
// All processing will now stop.
console.log('An event failed to process');
} else {
console.log('All events have been processed successfully');
}
});
});
// routes ==================================================
require('./app/routes')(app); // configure our routes
// start app ===============================================
console.log('Magic happens on port ' + port); // shoutout to the user
exports = module.exports = app; // expose app
對不起,我需要一些睡眠。你還在努力嗎?如果是這樣,我想再看看它,因爲這是一個有趣的問題,也許我們可以打敗它。你可以編輯你的問題,並詳細解釋min_timestamp業務是如何工作的?我無法弄清楚爲什麼照片增加了它,爲什麼它最終等於end_timestamp。 – mwarren 2015-01-10 16:03:36
你是什麼意思的'相同的照片塊' - 只是照片從第一個事件重複或照片都是一樣的? – mwarren 2015-01-10 16:09:46
我沒有得到真正的地方,無法測試它。太多的問題要問你。但有一點有點奇怪:這就是說while()位的主函數沒有回調(),我認爲這是必要的。 – mwarren 2015-01-10 17:38:51