Gulp browser-sync - redirect API request via proxy

匿名 (未验证) 提交于 2019-12-03 02:05:01

问题:

I'm trying to redirect my API requests like this with gulp and browser-sync:

gulp.task('browser-sync', function () {     var files = [       '../index.html',       '../views/**/*.html',       '../assets/css/**/*.css',       '../assets/js/**/*.js'    ];     var url = require('url'),    proxy = require('proxy-middleware');    var proxyOptions = url.parse('http://localhost:8000/api');    proxyOptions.route = '/api';     browserSync.init(files, {       server: {          baseDir: '..',          middleware: [proxy(proxyOptions)]       }    });  }); 

But I get this response when a call is sent to the API:

Error: connect ECONNREFUSED     at errnoException (net.js:904:11)     at Object.afterConnect [as oncomplete] (net.js:895:19) 

Any idea on what I'm doing wrong?

回答1:

Checkout the official documentation about using BrowserSync with Gulp. I was able to get BrowserSync up and running with a proxy on /api with no issue.

Check to make sure nothing else is using port 8000. You can change what port BrowserSync uses via the port option when initializing BrowserSync.

Here is the gulpfile.js I ended up with:

npm install gulp url proxy-middleware browser-sync --save-dev

// Include gulp var gulp = require('gulp');  var url = require('url'); var proxy = require('proxy-middleware'); var browserSync = require('browser-sync');   var paths =  {     css: ['./**/*.css', '!./node_modules/**/*'] };   // browser-sync task for starting the server. gulp.task('browser-sync', function() {     var proxyOptions = url.parse('http://localhost:3000/secret-api');     proxyOptions.route = '/api';     // requests to `/api/x/y/z` are proxied to `http://localhost:3000/secret-api`      browserSync({         open: true,         port: 3000,         server: {             baseDir: "./",             middleware: [proxy(proxyOptions)]         }     }); });  // Stream the style changes to the page gulp.task('reload-css', function() {     gulp.src(paths.css)         .pipe(browserSync.reload({stream: true})); });  // Watch Files For Changes gulp.task('watch', function() {     gulp.watch(paths.css, ['reload-css']); });  // Default Task gulp.task('default', ['browser-sync', 'watch']); 

If you do not want to make a separate gulp task to reload/stream the changes, you can use the files option:

browserSync({     open: true,     port: 3000,     server: {         baseDir: "./",         middleware: [proxy(proxyOptions)]     },     files: paths.css }); 


回答2:

I ran into the same issue with the gulp + browser-sync + proxy-middleware setup, while migrating from grunt to gulp.

Error: connect ECONNREFUSED     at errnoException (net.js:904:11)     at Object.afterConnect [as oncomplete] (net.js:895:19) 

In my case something within the corporate network which didn't allow proxy-middleware to work. As soon I was on the public network, the issue was gone.

With grunt-connect + grunt-connect-proxy I could proxy files within the corporate network without any problems.

proxy-middleware implements its own proxy functionality, while grunt-connect-proxy uses http-proxy to do the actual proxy work.

I ended up writing a small middleware wrapper around http-proxy to be used in browser-sync and connect, which solved the proxy issues in the corporate network.

https://www.npmjs.com/package/http-proxy-middleware

var browserSync = require('browser-sync'); var proxyMiddleware = require('http-proxy-middleware');  var proxy = proxyMiddleware('/ajax', {target: 'http://cdnjs.cloudflare.com'});  browserSync({     server: {         baseDir: "./",         port: 3000,         middleware: [proxy]     } }); 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!