Node.js 系列學習日誌#17 - 使用 express, ejs 實作讀取靜態 JSON 格式資料

今天來介紹 express, ejs 實作讀取靜態 JSON 格式資料程式

本章節將會學習到:

  • 使用 ejs 樣板引擎建立檢視頁面
  • 建立 Json 檔案及資料,並採取 /api/posts 列出所有 json 資料
  • 採取 /post/:id 取得某一筆資料
    首先我們先建立一個目錄叫 demo-express-json 的資料夾,然後使用指令進入到 demo-express-json 資料夾裡面,接著安裝 express 框架以及 ejs 的樣板引擎
1
$npm install —save express ejs

建立 josn 檔案

建立完成之後,我們在 demo-express-json 會出現 node_module 資料夾,裡面則是有 express, ejs 套件相關檔案,接下來在根目錄下建立一個 posts.json 格式檔案,資料先假定設定為:

(文字是用亂數假文產生器弄的,因此無需認真讀囉)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[
{
"title": "會濟報好大必者政下二",
"id": "fdb61c16-4bba-11e4-9e35-164230d1df67",
"content": "容有那一氣持地來於結主了友如頭……院還地入。出乎機富事的著度同禮、時在科種力事再數總源式孩?"
},
{
"title": "主覺問我的食什期和",
"id": "0bc365ac-4bbb-11e4-9e35-164230d1df67",
"content": "生老了險實去供考權是車子氣長不別相且員高麼也工家看"
},
{
"title": "是實裡在園時傳",
"id": "0ff44786-4bbb-11e4-9e35-164230d1df67",
"content": "不半過何:為濟是在制們。裡得一方出,處師取是你賣而陽"
}
]

這個 json 檔每一筆資料以 title, id, content 參數為主

建立 app.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// express web framework
var express = require('express');
//讀取 posts.json
var fs = require('fs');
var app = express();

//放置靜態網頁
app.use('/public', express.static(__dirname + '/public'));

//定義網站標題
app.locals.title="Get json data using express web framework";

app.all('*', function(req, res, next){
fs.readFile('posts.json', function(err, data){
res.locals.posts = JSON.parse(data);
next();
});
});

//網頁主進入點
app.get('/', function(req, res){
//指定 /views/idex.ejs
res.render('index.ejs');
});

//顯示 posts.json 資料
app.get('/api/posts', function(req, res){
res.json(res.locals.posts);
});

//當 url 是 /post/:id 時, 取得某一筆資料
app.get('/post/:id', function(req, res, next){
//取得 post.json 資料夾
res.locals.posts.forEach(function(post){
//從 url 取得 id 參數與 posts.json 裡的 id
if (req.params.id === post.id){
//顯示參數為 url 中 id 的 post.id, 那麼顯示部分資料
res.render('post.ejs', { post: post });
}
})
});

app.listen(3000);
console.log('app is listening at localhost:3000...’);

再來是建立檢視資料夾 views,因為我們在 app.js 裡面設定樣板引擎是用 ejs,所以在 views 資料夾裡面新增三個檔案,分別是 header.ejs, index.ejs, footer.ejs

header.ejs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title><%= title %></title>
<link rel="stylesheet" href="/public/styles.css">
</head>
<body>

<header>
<div class="container">
<h1><a href="/"><%= title %></a></h1>
</div>
</header>

footer.ejs

<footer>
<div class="container">
This is footer side.
</div>
</footer>

</body>
</html>

index.ejs

<% include header %>

<main role="main">
<div class="container">
<h3><a href="/api/posts">/api/posts</a></h3>
<% posts.forEach(function(post){ %>
<h3>
<a href="/post/<%= post.id %>">
<%= post.title %>
</a>
</h3>
<div><%= post.content %></div>
<% }); %>
</main>
</div>

<% include footer %>

建立靜態資料

在 app.js 檔案裡有一行是

1
app.use('/public', express.static(__dirname + '/public'));

在做網站的過程,我們會建立 css,js 檔案,在根目錄下建立一個 public,並且在這個檔案增加一個 style.css,去定義一些樣式的方式,我這邊就不太多做 css 的解釋囉。

執行

1
$node index.js

結果

參考資料

http://expressjs.com/
http://expressjs.com/4x/api.html#app.locals
http://www.richyli.com/tool/loremipsum/