从stream库中抛出错误时,正确处理Gulp.js乙烯stream错误

我正在使用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如下所示:

 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不能用于stream,因为它们是asynchronous的,那么附加一个error handling程序的最好方法是什么,这样我的吞吐进程就不会在遇到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) 

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

使用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进行转译,应该做同样的事情。