2014-10-28 214 views
-1

我不明白我的路由有什么问题。为什么没有找到资源,如果我用app.js文件定义url模式回调?node.js中的简单路由

app.get('/myroute', function(req, res) { 
    res.send('Hello /myroute from app.js') 
}); 

var express = require('express'); 

/*var routes = require('./routes/index'); 
var users = require('./routes/users');*/ 

var app = express(); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(__dirname + '/public/favicon.ico')); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 

/*app.use('/', routes); 
app.use('/users', users);*/ 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

app.get('/myroute', function(req, res) { 
    res.send('Hello /myroute from app.js') 
}); 

如果我取消下一行:

var routes = require('./routes/index'); 
var users = require('./routes/users'); 

app.use('/', routes); 
app.use('/users', users); 

而且把我的URL模式回调./routes/index它会工作!

router.get('/myroute', function(req, res) { 
    res.send('Hello/from /route/index.js'); 
}); 

回答

0

在这个非常有趣的帖子https://blog.safaribooksonline.com/2014/03/10/express-js-middleware-demystified/,你可以找到下一个:

中间件是任意数量的由 Express.js路由层最终请求处理程序是之前调用的函数,并由此 坐镇在原始请求和最终预定路线之间的中间。我们常常把这些功能作为中间件堆栈,因为 他们总是在它们加入

因此,如果你要处理404错误的顺序调用,然后你必须把:

app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

毕竟路由处理程序。

1

您是否在代码中包含了url模块?因为我看不到

require('url'); 

在您提供的代码中。

我刚刚创建了一个新的node.js项目,并包含了url模块。它似乎工作正常,我没有看到你提到的问题。

如果这没有解决,也许你可以提供更具体的错误代码?

+0

是的,我用它。就像我想的那样,我不会包含可能不相关的代码。我可能找到了答案。 – Ark 2014-10-29 09:39:18

0

我明白了。它与passing request between middleware有关。所以下面如果我打电话next()没有参数res.send('Hello /myroute from app.js')将被处理。

app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(); // early was next(err) 
}); 

app.get('/myroute', function(req, res) { 
    res.send('Hello /myroute from app.js') 
}); 

或者如果在所有路由下放置路由错误处理程序,会更好。