前言 Express 是基於 Node.js 平臺的 web 應用開發框架,在學習了 Node.js 的基礎知識後,可以使用 Express 框架來搭建一個 web 應用,實現對資料庫的增刪查改。 資料庫選擇 MongoDB,它是一個基於分散式文件存儲的開源資料庫系統,Mongoose 是 Mong ...
前言
Express 是基於 Node.js 平臺的 web 應用開發框架,在學習了 Node.js 的基礎知識後,可以使用 Express 框架來搭建一個 web 應用,實現對資料庫的增刪查改。
資料庫選擇 MongoDB,它是一個基於分散式文件存儲的開源資料庫系統,Mongoose 是 MongoDB 的對象模型工具,可以在非同步環境里工作。
接下來就使用 Express + Mongoose 來實現簡單的增刪查改,在實現的過程中來學習 Express 和 Mongoose 的基礎知識。
原文作者:林鑫,作者博客:http://blog.gdfengshuo.com/
準備
既然是基於 Node.js 的框架,那麼肯定需要裝 node.js,還有 MongoDB,網上有很多安裝教程。然後使用 express-generator 來快速生成一個 Express 項目。那麼先安裝一下 express-generator
npm install -g express-generator
然後初始化一個名為 express-demo 的項目
express express-demo
目前 Express 已經發佈到了 4.x 版本,接下來也是基於這個版本來實現的。
cd express-demo
npm install
npm start
瀏覽器打開 http://localhost:3000 ,就可以看到已經可以訪問了。
目錄
├─bin/ // 啟動文件
├─public/ // 資源文件
├─routes/ // 路由
├─views/ // 視圖
├─app.js
└─package.json
初始化的項目目錄簡單明瞭,接下來我們來看看 app.js 里是寫了什麼。
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
這是設置模板引擎,使用了 jade 模板引擎,views/ 目錄下都是 .jade 格式文件,這種寫法我並不熟悉,那麼來改一下,改成 ejs 引擎,.html 格式的視圖文件。(需要 npm 安裝 ejs 模塊)
var ejs = require('ejs');
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.engine('html', ejs.__express);
app.set('view engine', 'html');
實現
以上準備都好了之後,我們就來看看如何實現用戶信息的增刪查改。這裡我們先把視圖和路由搭建起來,能訪問頁面之後再來實現資料庫操作的功能。
用戶列表
在 view/ 視圖目錄下創建以下文件: UserList.html
<!DOCTYPE html>
<html>
<head>
<title>用戶列表頁面</title>
</head>
<body>
<table>
<tr>
<th>用戶名</th>
<th>郵箱</th>
<th>操作</th>
</tr>
<% for(var i in user){ %>
<tr>
<td><%= user[i].username %></td>
<td><%= user[i].email %></td>
<td>
<div>
<a href="/users/detail/<%= user[i]._id %>"> 查看 </a>
<a href="/users/edit/<%= user[i]._id %>"> 編輯 </a>
<a href="#" class="del" data-id="<%= user[i]._id %>"> 刪除 </a>
</div>
</td>
</tr>
<% } %>
</table>
</body>
</html>
<% %> 就是 ejs 模板引擎的語法,user 是在路由渲染頁面的時候傳過來的,它是如何傳的,待會再看。
接下來實現上面視圖對應的路由,項目中預設已經給我們生成了兩個路由。在 routes/ 路由目錄下已經有了兩個路由文件:index.js 和 users.js。
app.js 中,已經幫我們設置好了這兩個路由:
var index = require('./routes/index');
var users = require('./routes/users');
app.use('/', index);
app.use('/users', users);
只要瀏覽器訪問 http://localhost:3000/users ,就能訪問到 users 對應的頁面了。我們來看看路由里 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;
express.Router 類創建模塊化、可掛載的路由句柄。我們修改上面代碼來創建用戶列表的路由 users/list
var express = require('express');
var router = express.Router();
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
router.get('/list', function(req, res, next) {
var list = [{_id: 1, username: 'linxin', email: '[email protected]'}];
res.render('UserList',{
user: list
})
});
module.exports = router;
還記得在 UserList.html 視圖中的 user 變數嗎,這裡用到了 res.render() 響應方法,功能就是渲染視圖模板,第一個參數為視圖文件名,第二個參數為對象,用於向模板中傳遞數據,user 就是在這裡傳過去的。更改完路由之後重啟伺服器,訪問 http://localhost:3000/users/list 就可以看到用戶列表頁面了。
但是這用戶信息是寫死的,要怎麼從資料庫中讀取呢?
連接資料庫
我們這裡用到了 Mongoose,需要先安裝 npm install mongoose -S 。安裝之後在項目中引入並連接到資料庫 userdb
var mongoose = require('mongoose');
mongoose.Promise = global.Promise;
mongoose.connect('mongodb://localhost:27017/userdb', {useMongoClient: true});
連接成功之後,定義一個 Schema,它一種以文件形式存儲的資料庫模型骨架,不具備資料庫的操作能力。
var userSchema = new mongoose.Schema({
username: String,
email: String
})
這裡的 userSchema 還不能對資料庫進行操作,只是定義了數據模型屬性 username, email 為字元串類型。需要將該 Schema 發佈為 Model,Model 是由 Schema 發佈生成的模型,具有抽象屬性和行為的資料庫操作對。
var model = mongoose.model('user', userSchema);
最後 model 就可以對資料庫進行操作了,把上面的代碼封裝成 userModel.js 到根目錄下新建一個 models/ 目錄下麵,用 module.exports = model; 將 model 暴露出來供其他文件使用。
在 user.js 路由文件里,我們來引入 userModel.js 進行資料庫操作。
var userModel = require('../models/userModel.js');
router.get('/list', function(req, res, next) {
userModel.find(function(err, data){
if(err){ return console.log(err) }
res.render('UserList',{
user: data
})
})
});
這裡使用 userModel.find() 查詢到所有用戶。但是現在資料庫里還是空的,我們來新增一個添加用戶頁面向資料庫里插入數據。
添加用戶
在 views/ 目錄下新建 UserAdd.html 添加用戶視圖
<!DOCTYPE html>
<html>
<head>
<title>用戶編輯頁面</title>
</head>
<body>
<form action="/users/add" method="post">
<input type="text" name="username" value="">
<input type="email" name="email" value="">
<button type="submit">submit</button>
</form>
</body>
</html>
在 user.js 路由文件里來添加對應視圖的路由
router.get('/add', function(req, res, next) {
res.render('UserAdd');
});
這是渲染視圖頁面的路由,我們需要添加一個 post 方法的路由,在點擊提交按鈕的時候,把數據存進資料庫里。
router.post('/add', function(req, res, next) {
var newUser = new userModel({
username: req.body.username,
email: req.body.email
})
newUser.save(function(err, data){
if(err){ return console.log(err) }
res.redirect('/users/list');
})
});
這裡使用 new userModel() 創建了一個 Entity,它是由 Model 創建的實體,它的操作也會影響資料庫。newUser 調用 save() 方法將數據保存到資料庫中。然後 res.redirect() 將頁面重定向到用戶列表頁面,這時就可以看到我們新增的用戶顯示在列表中了。接下來我們看看如何來編輯用戶信息。
編輯用戶
依然是創建相應的用戶編輯視圖:UserEdit.html
<!DOCTYPE html>
<html>
<head>
<title>用戶編輯頁面</title>
</head>
<body>
<form action="/users/update" method="post">
<input type="hidden" name="id" value="<%= user._id %>">
<input type="text" name="username" value="<%= user.username %>">
<input type="email" name="email" value="<%= user.email %>">
<button type="submit">update</button>
</form>
</body>
</html>
添加對應的路由:/users/edit/:id 來渲染視圖,/users/update 來修改資料庫數據
router.get('/edit/:id', function (req, res, next) {
var id = req.params.id;
userModel.findOne({_id: id}, function (err, data) {
res.render('UserEdit', {
user: data
})
})
});
router.post('/update', function (req, res, next) {
var id = req.body.id;
userModel.findById(id, function (err, data) {
if(err){ return console.log(err); }
data.username = req.body.username;
data.email = req.body.email;
data.save(function(err){
res.redirect('/users/list');
})
})
});
userModel.findOne() 會根據查詢條件 {_id: id} 查詢到對應的一條數據,那麼同理,查看用戶詳情的實現也是如此,只是渲染你到另外一個模板而已,這裡就不重覆寫了;userModel.findById() 查詢到 data 對象,該對象也屬於 Entity,有 save() 操作。req.body.username 就可以獲取到我們修改後的 username,修改 data 對象之後調用 save() 方法保存到資料庫中。接下來看看如何刪除用戶吧。
刪除用戶
在用戶列表中,點擊刪除按鈕,就把該用戶從資料庫中給刪除了,不需要視圖,那直接寫路由吧。
router.delete('/del', function (req, res) {
var id = req.query.id;
userModel.remove({_id: id}, function (err, data) {
if(err){ return console.log(err); }
res.json({code: 200, msg: '刪除成功'});
})
})
點擊按鈕,發送刪除的請求,那我們可以使用 ajax 來實現。在用戶列表頁面引入 jquery,方便我們操作。然後添加 ajax 請求
$('.del').on('click',function(){
var id = $(this).data('id');
$.ajax({
url: '/users/del?id='+id,
type: 'delete',
success: function (res) { console.log(res); }
})
})
重啟伺服器,進入 users/list,點擊刪除按鈕,如果看到控制臺中已經列印了 {code: 200, msg: '刪除成功'} ,表示已經成功刪除了,這時我們刷新頁面,看看列表中確實已經不存在該用戶了。
代碼地址: express-demo
總結
通過對用戶的增刪查改,學習如何寫路由已經如何操作資料庫。我們來總結一下:
- 定義 Schema,由 Schema 發佈 Model 來操作資料庫。
- Model 創建的實體 Entity,可以調用 save() 方法將數據保存到資料庫中。
- Model.find() 方法查詢到該 Schema 下的所有數據,findOne() 根據條件查詢數據,findById() 根據 id 查詢數據。
- Model.remove() 刪除數據。