2017-08-12 51 views
0

我刚刚生成了Express应用并添加了自定义路由(/ configuration)。但是,如果我尝试打开http://localhost:3000/configuration,服务器将返回404 Not Found错误。我检查了代码,不明白错误在哪里。为什么在Express/node.js中的路由器返回404

app.js

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 

var index = require('./routes/index'); 
var config_page = require('./routes/configuration'); 

var app = express(); 

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

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('/', index); 
app.use('/configuration', config_page); 

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

// error handler 
app.use(function(err, req, res, next) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
    res.render('error'); 
}); 

module.exports = app; 

路由/ configuration.js(路由/ index.js是相似的)

var express = require('express'); 
var router = express.Router(); 

/* GET configuration page. */ 
router.get('/configuration', function(req, res, next) { 
    res.render('configuration', { title: 'My App | Configuration' }); 
}); 

module.exports = router; 

回答

2

此代码是问题

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

也是生成的当前Url你的申请是http://localhost:3000/configuration/configuration。如果你对此进行查询,那么它将起作用。现在,如果你想与http://localhost:3000/configuration一起使用它。那么你需要从任何地方移除路径。可能是你可以在这样的主文件中更改

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('/', index); 
app.use('/',config_page); //-----------> this is the line you need to change 

它如何用于错误处理。删除它并添加此代码以捕获应用程序中的任何错误。

process.on('uncaughtException', function (err) { 
    // This should not happen 
    logger.error("Pheew ....! Something unexpected happened. This should be handled more gracefully. I am sorry. The culprit is: ", err); 
}); 
+0

现在它返回'无法GET /配置' – mxsin

+0

我相信“无法GET/xyz”消息是默认的404消息。也不知道这个答案如何改变任何事情,只要错误处理结束,它不应该干涉。我很确定404错误不算作未捕获的异常 – Poootaatoooo

+0

我刚刚注意到,如果您将所有路由存储在一个文件中(例如index.js),那么一切正常。但是,如果为每个页面在**路由**中创建一个单独的**。js **,则服务器开始为除主页面之外的所有页面返回404错误。我无法理解Express中路由器的逻辑... – mxsin