2011-09-09 8 views
0

내 라우팅을 분류하는 데 'express-namespace'를 사용하고 있습니다. 내 코드는 다음과 같습니다.nodejs/expressjs의 "정의되지 않은 함수가 아닙니다"

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

내 포인트는 하나의 .js 파일로 내 컨트롤러 코드를 이동하고 소문자 대응에 내 모든 컨트롤러를 매핑하는 것입니다

.. 
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 코드 URL 그래서 내 애플 꽤 깔끔한입니다.

'노드 app.js'를 실행할 때마다 첫 번째 POST에 매우 효과적입니다. 내가 두 번째로 URL에 POST 경우 는 다음과 같은 예외 가 발생

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 

사람이 여기 나에게 힌트를 줄 수 있습니까?

답변

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

나는 express-namespace를 사용하지 않은하지만 나는 그들이 req.params를 사용 와서 그냥 컨트롤러의 URL을 매핑 할 수 있다고 생각합니다. 그래서 같이 :

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을 처음 접한다.

관련 문제