天天看點

mongodb(mongoose)+express(nodejs)搭建web應用使用mongodb(mongoose)+express(nodejs)搭建web應用

使用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,送出表單,然後看看控制台是不是送出成功了

繼續閱讀