使用mongodb(mongoose)+express(nodejs)搭建web應用
安裝好nodejs,mongodb,具體方法請自行搜尋(mac osx 使用 homebrew安裝mongodb後,一些小問題的解決方案)
mongoose的好處:防止在大量并發的情況下出錯;讓nodejs更容易操作mongodb資料庫。最大的特色就是對象模型。
開始
在确認已經安裝了node之後(下載下傳), 在你的機器上建立一個目錄
$ mkdir hello-world
在這個目錄中建立一個package.json檔案, 這個檔案是你整個程式的一個簡介,其中最重要的是
dependencise
,它确定你的這個應用依賴哪些包,以便下載下傳。版本号根據自己下載下傳的版本修改,防止将來版本更新導緻無法正确運作。—— `~'代表接近的版本号,'>='表示大于等于的版本号,其他<=符号都通用
{
"name": "hello-world",
"description": "hello world test app",
"version": "0.0.1",
"private": true,
"dependencies": {
"express": "~4.12.0",
"mongoose": "~3.8.24",
"ejs": "~2.3.1",
"body-parser": "~1.12.0",
}
}
進入package.json的目錄,運作
$ npm install
當npm完成後,你的應用所需的依賴就安裝到你的 ./node_modules 目錄裡了。
設定首頁
建立一個名為app.js的檔案
//執行個體化一個express對象以供使用
var express = require('express');
var app = express();
//當使用get方法擷取'/'位址的時候,傳回helloword。這裡req是從用戶端發送到服務端的請求對象,res是服務端的響應對象,req和res的具體使用方法,請到express官方api文檔了解http://expressjs.jser.us/
app.get('/', function(req, res){
res.send('Hello World');
});
//監聽3000端口
var server = app.listen(, function() {
console.log('Listening on port %d', server.address().port);
});
下面運作app.js
$ node app.js
打開你的浏覽器,輸入http://localhost:3000,helloworld就出現了
如何送出表單并向資料庫插入資料?
通過mongoose與資料庫建立連接配接
建立一個名為mongo.js的檔案
var mongoose = require('mongoose'),
//mongoose.connect(uri, options); uri的更多格式請檢視mongoose官方api文檔http://mongoosejs.com/docs/api.html#index_Mongoose-connect
var db = mongoose.connect('mongodb://localhost:27017/test').connection;
//一旦建立連接配接,則會觸發
db.on('connected', function () {
console.log('Mongoose connected to ' + uri);
});
//一旦該連接配接發生錯誤,則會觸發
db.on('error',function (err) {
console.log('Mongoose connection error: ' + err);
});
//一旦該連接配接被關閉,則會觸發
db.on('disconnected', function () {
console.log('Mongoose disconnected');
});
module.exports = mongoose;
關于建立超過兩個資料庫的連接配接方法 即 mongoose.connect 和 mongoose.creatConnection的差別。
connect和createConnection都能 連接配接mongodb資料庫,支援以URI或參數(host,database,port)的形式。
var mongoose = require('mongoose');
mongoose .connect('mongodb://www.csser.com/csser.com_database');
連接配接一旦建立成功,該連接配接執行個體的open事件就被觸發。如果你使用的是mongoose.connect方式,連接配接對象為mongoose.connection;否則,mongoose.createConnection傳回的是Connection對象。
如果你打開一個單獨的連接配接使用mongoose.createConnection(), 但試圖通路模型mongoose.model(“ModelName '),則不能按預期工作,因為它不是連接配接到一個活躍的資料庫連接配接。
在這種情況下通過建立的連接配接通路您的模型(是可以成功的):
var conn = mongoose.createConnection('your connection string'),
MyModel = conn.model('ModelName', schema),
m = new MyModel;
m.save(); // works
下面這種是錯誤的:
var conn = mongoose.createConnection('your connection string'),
MyModel = mongoose.model('ModelName', schema),
m = new MyModel;
m.save(); //doesn't work
model層——通過mongoose設定好資料的Schema
Schema是什麼?就是MVC架構中的M——model。看看具體代碼也許你就能明白了
設定好Schema後,就可以很友善的往資料庫中插入資訊了 建立一個名為userModel.js的檔案,這是一個社交網站的使用者資訊
var mongoose = require('./mongo'),
Schema = mongoose.Schema;
//每個使用者都一個好友清單
//Schema的定義中,可以初始化一些選項,在options的字段中:
//`_id` :預設為true,是否自動生成主鍵,是存入mongodb中的id,確定資料的唯一性。當某個Schema隻是嵌入别的Schema中而不需要單獨存入mongodb的時候,可以設定為false。
//`collection`: 自定義存入資料庫的collection的名字
var friendSchema = Schema({
userid: Number,
icon: {type:String,default:'default/heads/default.jpg'},
nickname: String,
remark: String,
status: Number//0-正在驗證中,1-成功成為好友,2-其他情況
}, {_id: false}),
//會存入資料庫的使用者資訊結構
userSchema = Schema({
userid: Number,
password: String,
nickname: String,
status: Number,//0-離線,1-線上,2-離開,3-隐身
icon: {type:String,default:'default/heads/default.jpg'},
email: String,
add: Number,//0-随意加,1-需要認證消息,2-不允許任何人加
birth: Date,
gender: Number,//0-女,1-男,2-保密
friends: [friendSchema],
regtime: {type: Date, default: Date.now}
}, {collection: 'users', });
module.exports = mongoose.model('Users', userSchema)
control層——通過mongoose操作資料
建立一個名為userControl.js的檔案,目的是為了定義 User的 插入函數
var mongoose = require('mongoose');
var User = require('./userModel');
var user = new User(),
U = module.exports;
//将需要被儲存的user對象傳入,在調用save插入資料庫,如果插入成功,控制台會輸出剛剛插入的user對象
U.insert = function (user) {
var u = new User(user);
u.save(function (err, newUser) {
if (err) return console.error(err);
console.log(newUser);
})
}
view層——web頁面
建立一個名為 index.ejs 的檔案 随意寫一個表單用做測試,注意:input的name要和設定的Schema的字段相同
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Examples</title>
</head>
<body>
<form action="/" method="post">
<input type="text" value="444792006" name='userid'>
<input type="text" value="123" name='password'>
<button>submit</button>
</form>
<script></script>
</body>
</html>
最後就是服務端的一些設定和路由
建立一個名為 app.js 的檔案
//bodyParser是用來解析post的請求體的,屬于express的一部分,但是需要另外引入
var mongoose = require('./mongo'),
User = require('./userControl'),
express = require('express'),
ejs = require('ejs'),
bodyParser = require('body-parser'),
app = express();
//設定view模闆所在的目錄
app.set('views',__dirname);
// 設定模闆引擎,如果不設定沒辦法渲染,這裡我們用的是ejs模版引擎
app.set('view engine', 'ejs');
app.use(bodyParser());
app.get('/',function(req, res){
res.render('index')
});
app.post('/', function(req, res){
//執行插入操作
User.insert(req.body);
});
var server = app.listen(, function() {
console.log('Listening on port %d', server.address().port);
});
完成
運作app.js
$ node app.js
打開http://localhost:3000,送出表單,然後看看控制台是不是送出成功了