如何允许grunt-contrib-connect在静态文件上允许POST,PUT,DELETE方法?

时间:2014-05-20 22:45:38

标签: gruntjs grunt-contrib-connect

我有一个静态项目,我正在尝试虚拟种子JSON文件,但它只允许我通过GET访问它们。这是我的grunt配置文件,有谁知道我将如何允许POST?

module.exports = function(grunt) {
    // Configure
    grunt.config.set('connect', {
        server: {
            options: {
                hostname: '*',
                middleware: function(connect) {
                    return [
                        function(request, response, next) {
                            response.setHeader('Access-Control-Allow-Origin', '*');
                            response.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
                            response.setHeader('Access-Control-Allow-Headers', 'Content-Type');

                            return next();
                        },
                        connect.static(require('path').resolve('.'))
                    ];
                }
            }
        }
    });

    // Load Task
    grunt.loadNpmTasks('grunt-contrib-connect');
};

2 个答案:

答案 0 :(得分:2)

这是我的解决方案,希望可以帮到你,我只检查base [0],你可以扩展它。

重要的是使用:中间件。取消移动,而不是推送

connect: {
  dev: {
    options: {
      // 经过测试 connect插件会依照base的定义顺序检索文件
      // 这意味着如果存在相同文件,定义在前面的会优先返回
      base: ['app', '.'],
      port: 8888,
      // open: true,
      livereload: true,
      hostname: 'localhost',
      middleware: function (connect, options, middlewares) {
        var fs = require('fs');
        var path = require('path');
        var support = ['POST', 'PUT', 'DELETE'];
        middlewares.unshift(function (req, res, next) {
          // 单独处理POST请求 请求的地址必须是文件 这里没有进行rewrite处理
          if (support.indexOf(req.method.toUpperCase()) != -1) {
            var filepath = path.join(options.base[0], req.url);
            if (fs.existsSync(filepath) && fs.statSync(filepath).isFile()) {
              return res.end(fs.readFileSync(filepath));
            }
          }

          return next();
        });

        return middlewares;
      },
    }
  }
}

答案 1 :(得分:1)

我有另一种解决此问题的方法,如果您的代码不适用于上述情况,请执行此操作:

connect: { 
            server: { 
                options: { 
                    keepalive: true, 
                    port: 8001, 
                    protocol: 'http', 
                    hostname: '*', 
                    directory: 'dist', 
                    open: { 
                        target: 'http://localhost:8001/myDemo.html', 

                    },
                        middleware: function(connect, options, middlewares) {

                                middlewares.unshift(function(req, res, next) {
                                    res.setHeader('Access-Control-Allow-Credentials', true);
                                    res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
                                    res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
                                    if (req.method.toUpperCase() == 'POST') req.method='GET';
                                    return next();
                                });

                                return middlewares;
                        }

                } 
            } 
        },

我确信这肯定会有效:)