我刚刚开始使用Node.js,我已经创建了一个端点,可以根据给定的查询使用Bing API下载图像。
我正在使用node-bing-api
app.get('/bing', function (req, res) {
var query = req.query.q;
buffer = {
"response": [],
"location": "",
"count": 0
};
buffer.location = temp.tmpNameSync({
template: 'XXXXXX'
});
Bing.images(query, {
top: 10,
imagefilters: {
size: 'Medium'
}
}, parseResponse);
function parseResponse(error, response, body) {
async.each(body.d.results, deepParse, function (err) {
if (err) {
console.log('Bing Async Error');
} else {
if (buffer.count > 0) {
async.each(buffer.response, downloadImages, function (err) {
if (err) {
console.log('Image Download Async Error');
}
});
}
}
});
res.send(buffer.location);
}
function downloadImages(data, callback) {
var dir = 'images/' + buffer.location;
var filename = dir + '/' + temp.tmpNameSync({
template: 'XXXXXX.jpg'
});
mkdirp(dir, function (err) {
if (err) {
console.log('Directory creation error');
} else {
request(data).pipe(fs.createWriteStream(filename));
callback();
}
});
}
function deepParse(data, callback) {
if (data.ContentType == "image/jpeg" && buffer.count < 5) {
request.head(data.MediaUrl, function (err, result, body) {
if (!err && result.statusCode == 200) {
buffer.response.push(data.MediaUrl);
buffer.count++;
callback();
} else {
callback();
}
});
} else {
callback();
}
}
});
我遇到的问题是,Node抛出一个错误:
TypeError: Cannot read property 'd' of undefined
at parseResponse (/Users/Primary/projects/node/librorum/server.js:335:18)
at Request._callback (/Users/Primary/projects/node/librorum/node_modules/node-bing-api/lib/bing.js:104:7)
at self.callback (/Users/Primary/projects/node/librorum/node_modules/request/request.js:354:22)
at Request.emit (events.js:95:17)
at null._onTimeout (/Users/Primary/projects/node/librorum/node_modules/request/request.js:961:12)
at Timer.listOnTimeout [as ontimeout] (timers.js:112:15)
我想这发生在我的parseResponse()函数的第一行。我不确定该怎么做,因为这个错误是零星的。代码有时会起作用,而在其他时候则不起作用(即使对于同一个查询)。
我的第二个问题是,“如果我运行3个不同的选项卡,其中有3个不同的查询/ bing将会运行3个app.get('/ bing',func ....)实例,或者只是一个实例?“
我问的原因有时当我在同一端点上使用不同查询运行多个选项卡时,某些文件夹无法创建。我无法理解为什么。可能是因为在上一个查询完成之前出现了新的查询? (可能这种情况会导致来自同一主机的3个查询?)
任何解决方案都会非常有用!