nodejs

时间:2015-06-27 06:52:31

标签: node.js

我刚刚开始使用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个查询?)

任何解决方案都会非常有用!

0 个答案:

没有答案