2014-10-19 31 views
3

编辑:默认快递程序是这样的:为什么/用户在Express和Node中路由?

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 routes = require('./routes/index'); 
var users = require('./routes/users'); 
---------------------------------------- 
These refer to files that look like: 

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

/* GET home page. */ 
router.get('/', function(req, res) { 
    res.render('index', { title: 'Express' }); 
}); 

module.exports = router; 
------------------------------ 
var app = express(); 

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

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

// error handlers 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function(err, req, res, next) { 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: err 
     }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: {} 
    }); 
}); 


module.exports = app; 

然而,文件说:

// this middleware will not allow the request to go beyond it 
app.use(function(req, res, next) { 
    res.send('Hello World'); 
}) 

// requests will never reach this route 
app.get('/', function (req, res) { 
    res.send('Welcome'); 
}) 

所以我的问题,就是为什么会要求永远做它的方式向/users路线何时已经指定了默认(即'/')路线?是否因为routesusers不是功能?

在相关说明中,为什么即使指定/,如果这是默认情况下每次都使用?

最后,默认应用程序指定'/users'路线:为什么不在index.js路线中放置另一条路径?我很困惑应用程序如何指定app.use('/users', users),然后在用户的路线,指定

router.get('/', function(req, res) { 
    res.send('respond with a resource'); 
}); 

什么是/对应?似乎对/的所有请求都将由第一条路径(使用routes默认文件的路径)处理。

+0

什么是'路线'和'用户'? – jfriend00 2014-10-19 03:45:58

+0

他们指的是路线。在根目录下有一个名为routes的文件夹,它有两个文件,一个是users.js和index.js文件。我相信'routes'默认为'index.js',而'users'引用'users.js'文件 – Startec 2014-10-19 03:48:30

+1

users文件中的'/'是用户路径的索引,即'users /'。这使得资源处理非常简单。 – Antiga 2014-10-19 03:51:03

回答

4

app.use()是中间件。您可以将它传递给一个可选路径和一个函数,并且函数的工作是确定是否要将请求传递给更多中间件或更多路由。它通过调用next()或者如果它不想传递它,它不会调用next()

所以,如果您有:

app.use("/", fn); 

中间件将调用的所有路径,但函数里面的代码你通过它来决定是否通过或不请求。

+0

你如何将请求传递给下一个中间件? – CodyBugstein 2014-10-20 09:21:42

+0

@Imray - 传递给中间件回调函数的第三个参数是函数引用(通常在参数中命名为“next”)。你把它叫做传递下一个中间件的请求。 – jfriend00 2014-10-20 14:52:04

+0

很酷谢谢。我不会认为这太快 – CodyBugstein 2014-10-20 22:50:44

1

中有Express 4的应用骨架两个路由器:routes(安装在'/')和users(安装在'/users')。你可以使用它们或只使用routes,或者你甚至可以添加更多的路由器。

app.js:

var routes = require('./routes/index'); 
var users = require('./routes/users'); 
app.use('/users', users); // please note the mounting point! 
app.use('/', routes); 

users.js

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

router.get('/', function(req, res, next) { 
    res.send('respond with a resource'); 
}); 

module.exports = router; 

请注意,router.get('/', ...)users路由器意味着该请求的URL http://yourserver/users而不是http://yourserver/

相关问题