"undefined не является функцией" в nodejs / expressjs - PullRequest
0 голосов
/ 09 сентября 2011

Я использую 'экспресс-пространство имен', чтобы классифицировать мою маршрутизацию.Это мой кодвсе мои контроллеры в соответствующие строчные URL, так что мое приложение довольно аккуратное.

Это работает довольно хорошо для первого POST каждый раз, когда я запускаю 'node app.js'.Если я отправляю сообщение по 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

Может кто-нибудь дать мне подсказку?

Ответы [ 2 ]

1 голос
/ 09 сентября 2011

Я не вижу явной ошибки, но вижу опасный 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 голосов
/ 30 августа 2013

Я не использовал express-namespace, но я думаю, что вы можете просто отобразить URL для контроллеров, когда они приходят с использованием 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...