【问题标题】:"undefined is not a function" in nodejs/expressjsnodejs/expressjs 中的“未定义不是函数”
【发布时间】:2013-08-30 20:07:29
【问题描述】:

我正在使用“express-namespace”对我的路由进行分类。 这是我的代码。

..
 9 var controllers = require('./controllers');
 10 require('express-namespace');
..
 46
 47 app.namespace('/json', function(){
 48     app.post('/', function(req, res, next){
 49         res.header('Content-Type', 'application/json');
 50         next();
 51     });
 52     /**
 53      * Map the controller objects and its actions
 54      * to the corresponding URL in lower case
 55      */
 56     for(var controller in controllers){
 57         app.namespace('/' + controller.toLowerCase(), function(){
 58             controller = controllers[controller];
 59             for(var action in controller){
 60                 app.post('/' + action.toLowerCase(), function(req,res){
 61                     action = controller[action];
 62                     action(req, function(result){
 63                         res.send(result);
 64                     });
 65                 });
 66             }
 67         });
 68     }
 69 });

这是我的 ./controllers.js 代码:

...
 4 var Users = {
 5 };
 6
 7 Users.create = function(req, result){
...
 22 }
 23
 24 exports.Users = Users;
 25

我的意思是将我的控制器代码移动到单个 .js 文件中并映射 我所有的控制器都变成了相应的小写 URL,所以我的应用是 很整洁。

每次我运行 'node 应用程序.js'。 如果我第二次 POST 到 URL,会出现以下异常 发生:

TypeError: undefined is not a function
   at CALL_NON_FUNCTION (native)
   at /home/carl/source/node/funner/app.js:62:21
   at callbacks (/usr/local/lib/node/.npm/express/2.4.6/package/lib/router/index.js:272:11)
   at param (/usr/local/lib/node/.npm/express/2.4.6/package/lib/router/index.js:246:11)
   at pass (/usr/local/lib/node/.npm/express/2.4.6/package/lib/router/index.js:253:5)
   at Router._dispatch (/usr/local/lib/node/.npm/express/2.4.6/package/lib/router/index.js:280:4)
   at Object.handle (/usr/local/lib/node/.npm/express/2.4.6/package/lib/router/index.js:45:10)
   at next (/usr/local/lib/node/.npm/connect/1.7.0/package/lib/http.js:201:15)
   at /usr/local/lib/node/.npm/connect/1.7.0/package/lib/middleware/session.js:323:9
   at /usr/local/lib/node/.npm/connect/1.7.0/package/lib/middleware/session.js:342:9

有人可以在这里给我提示吗?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    我没有看到明显的错误,但确实看到了一些危险的 javascript。 for( key in obj ) 语句应该被 hasOwnProperty ifs 过滤,并且使用 var 语句来限定循环内函数中的局部变量是很重要的。

     47 app.namespace('/json', function(){
     48     app.post('/', function(req, res, next){
     49         res.header('Content-Type', 'application/json');
     50         next();
     51     });
     52     /**
     53      * Map the controller objects and its actions
     54      * to the corresponding URL in lower case
     55      */
     56     for(var controller in controllers){
                **if(controller.hasOwnProperty(controller) {**
     57         app.namespace('/' + controller.toLowerCase(), function(){
     58             **var mycontroller** = controllers[controller];
     59             for(var action in mycontroller){
                        **if(mycontroller.hasOwnProperty(action) {**
     60                 app.post('/' + action.toLowerCase(), function(req,res){
     61                     **var myaction** = mycontroller[action];
     62                     myaction(req, function(result){
     63                         res.send(result);
     64                     });
     65                 });
                        }
     66             }
     67         });
                }
     68     }
     69 });
    

    【讨论】:

      【解决方案2】:

      我没有使用过express-namespace,但我认为您可以映射控制器的网址,因为它们使用req.params。像这样:

      app.namespace('/json', function(){
      
        app.post('/:controller/:action', function(req, res, next){
      
          var controller = req.params.controller,
                  action = req.params.action;
      
              controller[0] = controller[0].toUpperCase();
      
          if( controllers[ controller ][ action ] ){
            res.header('Content-Type', 'application/json');
      
            controllers[ controller ][ action ](req, function(result){
              res.send(result);
            });
      
          }
          else
            res.send('Action %s is not defined for the %s controller', action, controller);    
      
      
        });
      
      });
      

      app.post('/:controller', ...); 也可以这样做

      告诉我它是否有效。

      PD。我是node+express 的新手。

      【讨论】:

        猜你喜欢
        • 2016-02-03
        • 2014-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-27
        • 2015-09-29
        • 2015-11-08
        相关资源
        最近更新 更多