grunt-contrib-connect - undefined不是connect.static的函数

时间:2015-08-06 04:05:14

标签: node.js grunt-contrib-connect

我正在尝试以这样的方式配置grunt连接

  1. 对于静态页面,它提供来自src目录的页面
  2. 中间件拦截了Web服务调用,并且提供了静态json。
  3. 在正确模拟Web服务调用时,connect.static调用最终会出错

    TypeError: undefined is not a function
    

    虽然我意识到此模块的更高版本中提供了connect.static,但我已经升级到晚于该版本的版本

    这是我的package.json文件

    {
      "name": "my-angular-seed-project",
      "version": "1.0.0",
      "description": "angular seed with only bower and grunt",
      "main": "index.js",
      "dependencies": {
      },
      "devDependencies": {
        "bower": "^1.4.1",
        "grunt": "^0.4.5",
        "grunt-cli": "^0.1.13",
        "grunt-contrib-connect": ">=0.10.0",
        "grunt-contrib-jshint": "latest",
        "grunt-contrib-uglify": "latest",
        "grunt-contrib-watch": "latest",
        "jshint-stylish": "^2.0.1"
      },
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC"
    }
    

    这是gruntfile.js

    // Gruntfile.js
    
    // our wrapper function (required by grunt and its plugins)
    // all configuration goes inside this function
    module.exports = function(grunt) {
    
        var restEndPoints = {
            "/restapi/users": {"GET":"json-files/users.get.json"},
            "/restapi/users/login": {"GET":"json-files/users.get.json"},
            "/restapi/users/john@gmail.com": {"GET":"json-files/users.get.john.json"},
            "/restapi/nodes": {"GET":"json-files/nodes.get.json","PUT":"json-files/nodes.put.json","POST":"json-files/nodes.put.json"},
            "/restapi/nodes/Node1": {"GET":"json-files/nodes.get.node1.json","DELETE":"json-files/nodes.delete.node1.json"},
            "/restapi/services": {"GET":"json-files/services.get.json","PUT":"json-files/services.put.json","POST":"json-files/services.put.json"},
            "/restapi/services/nginx": {"GET":"json-files/services.get.nginx.json","DELETE":"json-files/services.delete.nginx.json"},
            "/restapi/commands": {"GET":"json-files/commands.get.json","PUT":"json-files/commands.put.json","POST":"json-files/commands.put.json"},
            "/restapi/commands/pwd": {"GET":"json-files/commands.get.pwd.json","DELETE":"json-files/commands.delete.pwd.json"}
        };
    
        String.prototype.endsWith = function(suffix) {
        return this.indexOf(suffix, this.length - suffix.length) !== -1;};
    
    
    
      // ===========================================================================
      // CONFIGURE GRUNT ===========================================================
      // ===========================================================================
      grunt.initConfig({
    
        // get the configuration info from package.json ----------------------------
        // this way we can use things like name and version (pkg.name)
        pkg: grunt.file.readJSON('package.json'),
    
        // all of our configuration will go here
            watch: {
    
            },
        // configure jshint to validate js files -----------------------------------
            jshint: {
              options: {
                reporter: require('jshint-stylish') // use jshint-stylish to make our errors look and read good
              },
    
              // when this task is run, lint the Gruntfile and all js files in src
              build: ['Gruntfile.js', 'src/**/*.js']
            },  
    
        // configure connect to run server (on test/serve or example)
          connect: {
            server: {
              options: {
                port : 8000,
                hostname : 'localhost',
                base : 'src',
                middleware: function (connect,options){return [
                    //Middleware #1 - for rest api calls
                  function restapiMiddleware(req, res, next) {
                      if (req.url.indexOf('restapi') > 0){
                        console.log(req.method+' request received for webservice api ['+req.url+']');
    
                        var match = false;
                        var json_file_to_serve = "";
                        var keys = Object.keys(restEndPoints);
                        keys.forEach(function(urlAsKey) {
                            if (req.url.endsWith(urlAsKey)) {
                                Object.keys(restEndPoints[urlAsKey]).forEach(function(httpMethodsAsKey) {
                                    if (req.method == httpMethodsAsKey){
                                            match = true;
                                            json_file_to_serve = restEndPoints[urlAsKey][httpMethodsAsKey];
                                    }
                                }); //forEach ends
                            }
                        }); //forEach ends
    
                        //no match with the url, move along
                        if (match == false) {
                            return next();
                        }
                        if (req.url.endsWith('/login')){
                        res.writeHead(200, { 'user-auth-token':'56f7997504b352cbf6ba6210409e423f5fdac49a','user-enc-email':'lJUXityStsKko/lPr9eJUc5fLFCV5kFm' });
                        }
                        //Finalize this response with json file
                        res.end(grunt.file.read(json_file_to_serve));
    
                    // if not restapi call then goto next middleware
                    // can we serve static right here ? 
                    }else{
                        return next();
                    }
                  } // element/middleware one ends so comma just json objects this is awesome
                  ,
                  //Middleware #2 for static page calls
                  function staticMiddleware(connect,options) {
                    connect.static(options.base);
                    //connect.static('src');
                  }
                ] // array ends
                }
              }
            }
          }
    
    
    
    
    
      });
    
      // ===========================================================================
      // LOAD GRUNT PLUGINS ========================================================
      // ===========================================================================
      // we can only load these if they are in our package.json
      // make sure you have run npm install so our app can find these
      grunt.loadNpmTasks('grunt-contrib-jshint');
      grunt.loadNpmTasks('grunt-contrib-uglify');
      grunt.loadNpmTasks('grunt-contrib-connect');
      grunt.loadNpmTasks('grunt-contrib-watch');
    
        //register the task
        grunt.registerTask('serve', ['connect', 'watch']);
    
    
    };
    

    我在这里错过了一些小事吗?

1 个答案:

答案 0 :(得分:0)

谢谢@ R4c00n& @Christian Fritz,我正在浏览grunt-contrib-connect的grunt文件,它使用serveStatic调用而不是connect.static,是的,模块serve-static是grunt contrib connect的node_modules的一部分。所以现在serveStatic(base.options)也会连接静态文件。 这是更新的grunt文件部分(虽然服务静态调用必须是第一个)

    middleware: function (connect,options){return [
      //statically serve pages from src directory
      serveStatic('src'),

      //Middleware #1 - for rest api calls
      function restapiMiddleware(req, res, next) {
                   // middleware code
      }];}