# 問答
### 怎樣定義模型?
Express 根本沒有涉及到數據庫,這個任務留給了第三方的node模塊,有了第三方的模塊基本上可以與任何數據庫交互
### 怎樣做用戶認證?
這是另一個Express不會做的事情, 你可以使用任何你想用的認證方案,[這里有一個簡單的例子](https://github.com/visionmedia/express/tree/master/examples/auth)。
### Express 支持哪個模板引擎?
任何遵守這樣回調的 `(path, locals, callback)` . 為了統一模板引擎接口和緩存,推薦查看[consolidate.js](https://github.com/visionmedia/consolidate.js) 尋找幫助. 有些沒有列出來的模板引擎沒準也支持Express.
### 我應該怎樣組織我的程序結構?
事實上這個沒有一個標準答案,這與你的程序規模和團隊強烈相關。 為了盡可能的靈活,Express沒有規定程序的結構
你可以把路由和其它的一些程序特定的邏輯代碼以任意的目錄結構任意數量的文件存放。 查看下面的例子找點靈感
* [Route listings](https://github.com/visionmedia/express/blob/master/examples/route-separation/index.js#L19)
* [Route map](https://github.com/visionmedia/express/blob/master/examples/route-map/index.js#L47)
* [Route bootstrapping](https://github.com/visionmedia/express/tree/master/examples/route-loading)
* [MVC style controllers](https://github.com/visionmedia/express/tree/master/examples/mvc)
已經存在的簡化這些模式的第三方Express擴展:
* [Resourceful routing](https://github.com/visionmedia/express-resource)
* [Namespaced routing](https://github.com/visionmedia/express-namespace)
### 我應該怎樣從多個目錄提供靜態文件服務?
你可以會在你的程序中多次使用任意一個中間件。 使用下面的方式,當你請求"GET /javascripts/jquery.js" 時,會先檢查 "./public/javascripts/jquery.js", 如果它不存在,隨后的中間件會檢查 "./files/javascripts/jquery.js".
```
app.use(express.static('public'));
app.use(express.static('files'));
```
### 怎樣在提供靜態文件服務的時候加一個前綴路徑名?
Connect's的中間件綁定技術允許你指定一個路徑名前綴, 一個常用的例子是你可以前綴一個根本不是請求路徑中一部分的字符。 假設你要請求 "GET /files/javascripts/jquery.js", 你可以把中間件掛在 "/files", 暴露出 "/javascripts/jquery.js"作為 `req.url` 來讓中間件為這個文件提供服務:
```
app.use('/public', express.static('public'));
```
### 怎么遷移 Express 2.x 應用程序?
Express 2x甚至能支持到node 1.0, 所以可能沒有必要由于Express 3x的重構和API改變就遷移,如果你對2x感覺良好,那就停留在那個版本上。真的要遷移可以看[這里](https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x) 或者查看一下3.x的[改動列表](https://github.com/visionmedia/express/wiki/New-features-in-3.x)
### 怎么處理404s?
在Express里404s不被認為是出錯的結果,所以錯誤處理中間件不會捕獲404s,這是因為一個404只是由于有一些額外的工作沒有做,換而言之,Express已經執行了所有的中間件 / 路由分發,然而沒有發現有返回。你所要做的僅僅是在代碼底部加一個中間件去處理沒有返回的情況,并且手動返回一個404
```
app.use(function(req, res, next){
res.send(404, 'Sorry cant find that!');
});
```
### Express里怎樣處理異常?
定義錯誤處理的中間件跟定義普通的中間件沒有什么區別,僅僅是參數必須定義為4個,它們定義如下 `(err, req, res, next)`:
```
app.use(function(err, req, res, next){
console.error(err.stack);
res.send(500, 'Something broke!');
});
```
查看 [錯誤處理](/guide.html#error-handling), 獲取更多信息
### 怎樣輸出純HTML文件?
不要這么做!根本沒有必要直接使用`res.render()`輸出HTML文件, 如果你有一個特定的文件應該使用 `res.sendfile()`,如果你要使用一個目錄里大量的靜態資源提供服務,請使用 `express.static()` 中間件.
### Express的代碼庫有多大?
Express 是一個非常小的框架,3.0.0正式發布版只有932行源碼,Express強烈依賴的Connect只有267行源碼,Connect可選的中間件和擴展總共1143行源碼,并且只有到使用時才會加載