Grunt重定向休息调用文件

时间:2015-10-03 14:53:27

标签: javascript gruntjs grunt-contrib-connect

我正在使用<a></a>连接服务器和所有这些grunt插件。在我添加一些休息电话之前,开发过程非常快。我决定制作一些示例livereload文件,这些文件将是其余的调用答案。

所以我需要重定向每次休息调用一些JSON文件夹(重要的是我会把它放在目标文件夹中)所以它会在 Angular 之外文件夹中。

所以我需要一些static转移调用,如:

plugin

grunt文件:(1个应用程序服务器,1个模拟webservices)

http.get(localhost:port/x/y/name) to target/jsons_examples/x/y/name.json
http.get(localhost:port/z/name) to target/jsons_examples/z/name.json

现在我需要在web服务模拟配置中将路径从json_contracts更改为角度文件夹smth之外的路径,如:./。/。/。/ target / json_contracts

1 个答案:

答案 0 :(得分:1)

您可以使用middleware选项注入自己的URL解析器。请参阅评论以了解其工作原理:

grunt.initConfig({
  connect: {
    all: {
      options:{
        port: 8080,
        base: dir_to_angular_main_folder
        hostname: "localhost",
        middleware: function(connect, options, middlewares) {
          middlewares.unshift(function(req, res, next) {
            // pattern is a RegExp which is going to find the redirected url
            var pattern = new RegExp('^/x/y/([0-9A-Z]+)$', 'i'),
                // matches is a result which is
                //  - undefined when no match found
                //  - an array with two values when found:
                //    0: the full string
                //    1: the string inside of the brackets (the file name)
                matches = req.url.match(pattern);

            // if your url does not match skip the bottom part
            if (!matches) return next();

            // this runs only if match is found, set up the redirect header
            // up to you to decide whether it is 301 or 302
            // I would keep it 302 for dev purposes (browsers won't cache it)
            res.writeHead(302, {
              Location: '/target/jsons_examples/x/y/' + matches[1] + '.json'
            });

            // send the response
            res.end();
          });

          return middlewares;
        }
      }
    }
  }
});

我猜你仍然需要将模式更改为你需要的模式(x / y / target不要作为真实姓名)。

可以说,如果不匹配此([0-9A-Z]+)并使用此处的匹配'/target/jsons_examples/x/y/' + matches[1] + '.json',您可以更轻松地完成此操作,他就是对的。它的名称只是因为它更灵活,例如当你在x和y之间有一个文件夹时。无论如何,正如之前所说,你也可以使它更简单,只需使用以下内容:

res.writeHead(302, {
  Location: '/target/jsons_examples' + req.url + '.json'
});

我无法测试它,也许它会给你一些错误,但我仍然希望这足以说明了什么以及如何做。

修改

好吧,根据您的JSON文件在Web服务器端不可见(根文件夹超出范围)的事实,您可以执行某种 url重写而不是重定向:

var fs = require('fs');

grunt.initConfig({
  connect: {
    all: {
      options:{
        port: 8080,
        base: dir_to_angular_main_folder
        hostname: "localhost",
        middleware: function(connect, options, middlewares) {
          middlewares.unshift(function(req, res, next) {
            // pattern is a RegExp which is going to find the redirected url
            var pattern = new RegExp('^/x/y/([0-9A-Z]+)$', 'i'),
                // matches is a result which is
                //  - undefined when no match found
                //  - an array with two values when found:
                //    0: the full string
                //    1: the string inside of the brackets (the file name)
                matches = req.url.match(pattern);

            // if your url does not match skip the bottom part
            if (!matches) return next();

            // this runs only if match is found, set up the redirect header
            // reads the file content and sends as a response
            res.end(fs.readFileSync('/<some-absolute-path>/target/jsons_examples/x/y/' + matches[1] + '.json', 'utf8'));
          });

          return middlewares;
        }
      }
    }
  }
});

请注意,您需要在Gruntfile的顶部包含Nodejs标准fs模块才能使其正常工作。这只是一个原型,根据您的要求改变路径。也许您还需要将mime-type编写为响应的标题,关于如何在Node中执行此操作已经有很多答案。