我正在使用'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'时,第一次POST都会很好 app.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
有人能在这里给我一个暗示吗?
答案 0 :(得分: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 });
答案 1 :(得分:0)
我没有使用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
的新手。