2014-05-20 26 views
4

我有一个静态项目,我打到假种子JSON文件,但它只允许我通过GET访问它们。这里是我的grunt配置文件,有谁知道我会如何允许POST?如何让grunt-contrib-connect在静态文件上允许POST,PUT,DELETE方法?

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

这是我的解决方案,希望可以帮到你,我只检查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

我有另一种方法来解决这个问题,如果做你的代码上述情况下无法正常工作:

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

       } 
      } 
     }, 

我相信这肯定会工作:)

+0

不喜欢的解决方案,因为我认为这是不好的做法,但是唯一一个适合我的方法。 – Tobi

相关问题