当从流式库中抛出错误时,正确处理Gulp.js乙烯基流错误

时间:2016-03-22 20:30:19

标签: javascript node.js gulp

我正在使用Gulp发现React JSX(是的,我知道)。

我有这个Gulp任务:

gulp.task('transpile-jsx', function () {
    return transpileJSX().on('error',function(err){   // < I just added this error handler, but it doesn't do much
        console.error(err);
    });
});

上面的任务就像这样调用:

gulp.task('metagen:all', ['transpile-jsx'], function (done) {

    runAllMetagens(done);

});

以及完成工作的实际功能如下:

function transpileJSX() {
    return gulp.src('./public/static/app/js/views/**/*.js').pipe(react({harmony: true}))
        .pipe(gulp.dest('./public/static/app/js/jsx'));
}

try / catch对于流不起作用,因为它们是异步的,所以附加错误处理程序的最佳方法是什么,以便我的gulp进程在遇到JSX转换错误时不会出现问题:

events.js:141
      throw er; // Unhandled 'error' event
      ^
Error: Parse Error: Line 94: Unexpected token >
    at throwError (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:2808:21)
    at throwUnexpected (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:2870:9)
    at parseJSXChild (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:7068:13)
    at parseJSXElement (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:7140:31)
    at parsePrimaryExpression (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:3572:20)
    at parseLeftHandSideExpressionAllowCall (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:3656:61)
    at parsePostfixExpression (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:3696:20)
    at parseUnaryExpression (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:3763:16)
    at parseBinaryExpression (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:3853:16)
    at parseConditionalExpression (/Users/amills001c/WebstormProjects/baymax/AdminUI/node_modules/gulp-react/node_modules/react-tools/node_modules/jstransform/node_modules/esprima-fb/esprima.js:3913:16)

我遇到的问题是实时发生的转换错误会导致我的开发服务器崩溃(因为我的开发服务器是我的吞吐过程),而这些转换错误正在影响我的吞噬过程。

1 个答案:

答案 0 :(得分:2)

使用gulp-util

然后将其用作

var gutil = require('gulp-util');

function transpileJSX() {
    return gulp.src('./public/static/app/js/views/**/*.js')
        .pipe(react({harmony: true}))
        .on('error', gutil.log) // Add gutil.log for error handling/logging
        .pipe(gulp.dest('./public/static/app/js/jsx'));
}

我在我的Browserify进程中使用它来捕获任何捆绑错误并显示它们而不会杀死我的Watchify实例。对于使用React进行转换,应该这样做。