使用Node.js和MongoDB通過Mongoshin和Express.js構建JSON REST API服務器

根據《JavaScript快速全棧開發》書籍和網絡上的融合整理出,方便自己和大家以後學習交流噠,更加爲了自己整理筆記--

將使用Mocha和Super Agent庫寫測試,然後使用測試驅動的方式用Express.js、MongoDBD Mongoshin庫開發一個免費的Node.js JSON Rest API服務器。

1.先創建一個用於保存測試文件的文件夾。可以人工創建也可以代碼創建。(我的路徑D:\A_Learn\Node.js\anzhuangmulu\NodeTest\rest-api)

mkdir rest-api

cd rest-api

2.用cmd進入存放node.js的目錄裏安裝Mocha、Exppect.js和Super Agent庫。

npm install mocha


npm install expect.js


npm install supperagent


3.【測試覆蓋率】使用Super Agent的鏈式調用函數。寫一個完整的express.test.js測試覆蓋率,放入剛纔創建的rest-api裏面(我的地址是D:\A_Learn\NodeJS\anzhuangmulu\NodeTest\rest-api)

var superagent = require('superagent')
var expect = require('expect.js')
describe('express rest api server',function(){
	var id
	it ('post object',function(done){
		 superagent.post('http://localhost:3000/collection/test')
			.send({name:'John',email:'[email protected]'})
			.end(function(e,res){
				 expect(e).to.eql(null)
				 expect(res.body.length).to.eql(1)
				 expect(res.body[0]._id.length).to.eql(24)
				 id = res.body[0]._id
				 done()
			})
	})
	it('retrieves an object',function(done){
		 superagent.get('http://localhost:3000/collections/test/'+id)
			 .end(function(e,res){
				 expect(e).to.eql(null)
				 expect(typeof res.body).to.eql('object')
				 expect(res.body._id.length).to.eql(24)
				 expect(res.body._id).to.eql(id)
				 done()
		 })
	})
	it('retrieves a collection',function(done){
		 superagent.get('http://localhost:3000/collections/test')
			 .end(function(e,res){
				 expect(e).to.eql(null)
				 expect(res.body.length).to.be.above(1)
				 expect(res.body.map(function(item){
					 return item._id
			 })).to.contain(id)
			 done()
		 })			
	})
	it('updates an object',function(done){
		 superagent.get('http://localhost:3000/collections/test/'+id)
			 .send({name:'Peter',email:'[email protected]'})
			 .end(function(e,res){
					 expect(e).to.eql(null)
					 expect(typeof res.body).to.eql('object')
					 expect(res.body.msg).to.eql('success')
					 done()
			 })
	})
	it('checks an uodated object',function(done){
		 superagent.get('http://localhost:3000/collections/test/'+id)
			 .end(function(e,res){
				 expect(e).to.eql(null)
				 expect(typeof res.body).to.eql('object')
				 expect(res.body._id.length).to.eql(24)
				 expect(res.body._id).to.eql(id)
				 expect(res.body.name).to.eql('Peter')
				 done()
		     })		 
	})
	it('removes an object',function(done){
		 superagent.get('http://localhost:3000/collections/test/'+id)
			 .end(function(e,res){
				 expect(e).to.eql(null)
				 expect(typeof res.body).to.eql('object')
				 expect(res.body.msg).to.eql('success')
				 done()
			 })
	})
})
最後cmd進入到D:\A_Learn\NodeJS\anzhuangmulu\NodeTest\rest-api後運行$mocha express.test.js命令,即可查看到6條信息。

(4)【依賴】將要使用Mongoskin,它是一個MongoDB庫,比原生MongoDB驅動好用。Express.js是Node.js核心模塊的包裝器,它下Connect中間件的基礎上構建而來,提供了大量的方便。

用cmd進入到node_modules目錄中進行安裝

npm install express

npm install -g mongoskin

npm install -g mogodb(因爲還要用到mongo所以也要安裝mongo哦.這個是全局安裝mongodb否則會報找不到mongo的錯誤)

新建一個ecpress.js放入rest-api目錄中

var express = require('express'),mongoskin = require('mongoskin')
var bodyParser = require('body-parser')
var app = express()
app.use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())
var db = mongoskin.db('localhost:27017/test',{safe:true});
app.param('collectionName',function(req,res,next,collectionName){
	 req.collection = db.collection(collectionName)
	 return next()
})
app.get('/',function(req,res){
	 res.send('please select a collection,'+'e.g.,/collections/messages')		
})
app.get('/collections/:collectionName',function(req,res){
		req.collection.find({},{limit:10,sort:[['_id',-1]]})
		.toArray(function(e,results){
			 if(e) return next(e)
				 res.send(results)
		})
})
app.post('/collections/:collectionName',function(req,res){
		 req.collection.insert(req.body,{},function(e,results){
			 if(e) return next(e)
			 res.send(results)
		 })	 
})
app.get('/collections/:collectionName/:id',function(req,res){
			 req.collection.findOne({_id:req.collection.id(req.params.id)},function(e,result){
				if(e) return next(e)
				 res.send(result)
			 })
})
app.put('/collections/:collectionName/:id',function(req,res){
			req.collection.update({_id:req.collection.id(req.params.id)},{$set:req.body},{safe:true,multi:false},function(e,result){
				 if(e) return next(e)
					 res.send((result===1) ? {msg:'success'} : {msg:'error'})
			})	
})
app.delete('/collections/:collectionName/:id',function(req,res){
			req.collection.remove({_id:req.collection.id(req.params.id)},function(e,result){
				 if(e) return next(e)
				 res.send((result === 1) ? {msg:'success'} : {msg:'error'})
			})	 
})
app.listen(3000)
在終端運行node express.js

在另外一個窗口(不要關閉之前那個)運行mocha  express.test.js

還可以在瀏覽器中查看比如http://localhost:3000/test

延伸:以前寫成以下時會報下面的錯誤

var express = require('express'),mongoskin = require('mongoskin')
var app = express()
app.use(bodyParser())

這是因爲express3和express4的區別:參考文獻:http://www.expressjs.com.cn/guide/migrating-4.html#overview

所以改成了下面這樣並且在node-moudle裏面引入body-parser (npm install body-parser):

var express = require('express'),mongoskin = require('mongoskin')
var bodyParser = require('body-parser')
var app = express()
運行了發現還報錯誤:body-parser deprecated bodyParser:use indiidual json/urlencoded middewares express.js:4:9

因此在裏面加上

var express = require('express'),mongoskin = require('mongoskin')
var bodyParser = require('body-parser')
var app = express()
app.use(bodyParser.urlencoded({extended:false}))app.use(bodyParser.json())


發佈了37 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章