Gulp browser-sync - 通过代理重定向API请求

时间:2014-08-20 16:50:44

标签: api proxy gulp middleware browser-sync

我尝试使用gulp和browser-sync重定向我的API请求:

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)]
      }
   });

});

但是当我向API发送呼叫时,我得到了这个回复:

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

对我做错了什么的想法?

2 个答案:

答案 0 :(得分:48)

结帐official documentation about using BrowserSync with Gulp。我能够在/api上使用代理启动并运行BrowserSync,没有任何问题。

检查以确保没有其他人使用端口8000。您可以通过port option when initializing BrowserSync更改BrowserSync使用的端口。

以下是gulpfile.js我最终的结果:

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/x/y/z`

    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']);

如果您不想单独执行gulp任务来重新加载/流式更改,可以使用files option

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

答案 1 :(得分:0)

我遇到了一个问题,我找不到解决方案。我需要两个选项:

  1. browser-syncSPA mode 中运行
  2. /api 路由有 middleware 个代理

SPA 模式似乎拦截了 /api 并呈现 index.html,而不是代理到后端。

解决方案是在 browser-sync sources 中:使用该 middleware 路线实现单一模式,该路线比手动添加的路线具有更高的优先级:

        if (bs.options.get("single")) {
            defaultMiddlewares.unshift({
                id: "Browsersync SPA support",
                route: "",
                handle: require("connect-history-api-fallback")()
            });
        }

根据需要进行以下配置 - SPA 路由位于中间件列表的末尾:

const proxy = require('proxy-middleware');
...
    server.init({
        ...
        middleware: [ {
            route: "/api",
            handle: proxy(url.parse("http://api.host:4444/api"))
        }, {
            id: "SPA support",
            route: "",
            handle: require("connect-history-api-fallback")()
        } ],
        single: false,
        ...
    })