NodeJs无法捕获错误

时间:2015-11-02 20:39:06

标签: node.js error-handling

我使用模块omdb,在使用模块时遇到错误。该错误是由以下两种方法之一引起的,但堆栈跟踪不显示哪种方法。此外,console.log都没有发射,所以我认为我在尝试处理可能的错误时犯了一些错误。 omdb.poster的描述是:

  

返回海报JPEG的可读流。

function downloadImage(show, callback) {
    var filename = show.title + + " " + show.year + ".jpg";
    var path = "./images/" + filename;
    omdb.poster(show)
        .pipe(fs.createWriteStream(path))
        .on('error', function(err) {
            console.log("Download Omdb image err: " + err + " for " + show.title + " " + show.year);
            callback(err, null);
        })
        .on('close', function() {
            callback(null, path);
        });

}

function getOmdbInfo(show, callback) {
    omdb.get(show, true, function(err, movie) {
        if(err) {
            console.log("err:" + show.title + " " + show.year);
            callback(err, null);
        }
        if(!movie) {
            console.log("No OMDB info results for: " + show.title + " " + show.year);
            callback('Movie not found!', null);
        } else {
            callback(null, movie);
        }
    });
}

错误:

\node_modules\needle\lib\needle.js:81
      throw new TypeError('URL must be a string, not ' + uri);
            ^
TypeError: URL must be a string, not null
    at Object.Needle.request (\node
_modules\omdb\node_modules\needle\lib\needle.js:81:13)
    at Object.exports.(anonymous function) [as get] (\node_modules\omdb\node_modules\needle\lib\needle.js:425:19)
    at \node_modules\omdb\index.js:251:26
    at \node_modules\omdb\index.js:198:13
    at done (\node_modules\omdb\node_modules\needle\lib\needle.js:234:9)
    at PassThrough.<anonymous> (\node_modules\needle\lib\needle.js:363:11)
    at PassThrough.emit (events.js:129:20)
    at _stream_readable.js:908:16
    at process._tickCallback (node.js:355:11)

2 个答案:

答案 0 :(得分:0)

查看omdb lib的这一部分:

module.exports.poster = function (show) {
    var out = new stream.PassThrough(),
        req;

    module.exports.get(show, false, function (err, res) {
        if (err) {
            out.emit('error', err);
        } else if (!res) {
            out.emit('error', new Error('Movie not found'));
        } else {
            req = needle.get(res.poster);

            req.on('error', function (err) {
                out.emit('error', err);
            });

            req.pipe(out);
        }
    });

一个有根据的猜测是内部module.exports.get方法将无效的网址传递给内部.get()方法(我假设res.poster不存在)。要完全确定 - 请仅测试给定电影的getOmdbInfo - 我的测试没有为'Fargo'示例返回电影对象。

答案 1 :(得分:0)

问题出现了,因为我在尝试管道文件后捕获了订单。 通过改变这个:

omdb.poster(show)
        .pipe(fs.createWriteStream(path))
        .on('error', function(err) {
            console.log("Download Omdb image err: " + err + " for " + show.title + " " + show.year);
            callback(err, null);
        })
        .on('close', function() {
            callback(null, path);
        });

对此:

omdb.poster(show)
        .on('error', function(err) {
            console.log("Download OMDB image err: " + err + " for " + show.title + " " + show.year);
            callback(err, null);
        })
        .pipe(fs.createWriteStream(path))
        .on('close', function() {
            callback(null, path);
        });

错误被捕获。