2014-10-19 72 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/

相關問題