2015-11-01 27 views
0

好這裏的情況,據我所知,有三種方法來創建Web應用程序我可以創建可用於提供HTML和REST API的路線嗎?

  1. 傳統的方式:從服務器渲染HTML頁面
  2. 不確定:創建一個API,讓用戶的瀏覽器下載 Javascript應用程序(Angular,React,Ember)獲得高分 交互式應用程序
  3. 未來:同構web應用程序,它將HTML與客戶端技術(Angular,React,Ember)一起從服務器。

由於更快的加載頁面,我打算使用第三種方式,但現在的問題是如果我要創建移動應用程序。

我的堆棧:Node.js的+陣營

讓我們說,如果我打算去移動,我需要重複同樣的路線和邏輯是什麼? 當前的問題

app.get('/users', function(req, res) { 
    res.render('index', { message: "Hey Im Jack" }); 
}); 

app.get('/api/users', function(req, res) { 
    res.json({ message: "Hey Im Jack" }) 
}); 

有沒有我可以用一個路線同時服務於HTML和REST什麼辦法?

回答

1

您最終只能發送HTML或JSON(如果是REST)。

/api/xxx路由語法使得它更清楚哪個路徑服務於JSON。

但是你可以依賴於客戶端的請求頭,以檢查他們是否請求JSON或HTML

app.get('/users', function(req, res) { 
    if (req.headers.accept && req.headers.accept.match(/json/)) 
     res.json(data); 
    else 
     res.render('index', data); 
}); 

Angular's $http usually requests json by default,不知道別人,但你可以設置標題。瀏覽器通常會請求text/html,但我不確定。

或者如果你只關心不必重複提取數據的邏輯,你可以把中間件前述兩種:

// regex to match both routes 
app.get(/.*users/, function(req, res) { 
    res.locals.data = { message: "Hey Im Jack" }; 
    req.next(); 
}); 

app.get('/users', function(req, res) { 
    res.render('index', res.locals.data); 
}); 

app.get('/api/users', function(req, res) { 
    res.json(res.locals.data) 
}); 
+0

謝謝你的回覆,第一位是移動有req.headers .accept.match()?和第二種解決方案,正則表達式可能是非常多餘的權利?因爲假設我有10條路線,並且都需要一些mongodb查詢,那麼是否需要創建另外10個附加中間件? –

+0

'req.headers'是客戶端發出的[HTTP請求](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields)的一個屬性,所以它肯定會出現在所有客戶端。 ['.accept'實際上可能不是](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html),在這種情況下,你應該這樣'req.headers.accept && req.headers.accept .match(...'。 – laggingreflex

+0

正則表達式路由的目的是爲中間件運行'/ users'或'/ api/users'。既然你說過,編寫大概運行相同查詢的代碼是多餘的對於這兩種情況,代碼可以在兩個中間件的兩個路由中運行,如果你有10條路由需要相同的** mongodb查詢,那麼你只需要1個這樣的中間件就可以了。所有不同的,需要不同的查詢代碼,然後是的,我沒有看到前面的中間件的目的, – laggingreflex

相關問題