$ git clone git@github.com:azat-co/rest-api-express.git $ npm install $ node express.js
$ mongod 와 함께 MongoDB를 시작한다. 그다음, 새 터미널창을 띄워서 모카 테스트를 실행한다. :
$ mocha express.test.js
아니면, 모카를 전역으로 설치하지 않은 경우. :
$ ./node_modules/mocha/bin/mocha express.test.js
- express: ~4.1.1
- body-parser: ~1.0.2
- mongoskin: ~1.4.1
- expect.js: ~0.3.1
- mocha: ~1.18.2
- superagent: ~0.17.0
$ mkdir rest-api $ cd rest-api
우리는 모카, Expect.js, SuperAgent 라이브러리를 사용하게 될 것이다. 그것들을 설치하고, 프로젝트폴더에 들어가서 이 명령을 실행해라.
$ npm install mocha@1.18.2 --save-dev $ npm install expect.js@0.3.1 --save-dev $ npm install superagent@0.17.0 --save-dev
- 새 객체를 생성한다.
- 객체의 ID를 가져온다.
- 객체의 모든 정보를 가져온다.
- ID를 이용해 객체를 업데이트한다.
- ID를 이용해 객체를 제거한다.
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/collections/test') .send({ name: 'John' , email: 'john@rpjs.co' }) .end(function(e,res){ // console.log(res.body) 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){ // console.log(res.body) 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){ // console.log(res.body) expect(e).to.eql(null) expect(res.body.length).to.be.above(0) expect(res.body.map(function (item){return item._id})).to.contain(id) done() }) }) it('updates an object', function(done){ superagent.put('http://localhost:3000/collections/test/'+id) .send({name: 'Peter' , email: 'peter@yahoo.com'}) .end(function(e, res){ // console.log(res.body) expect(e).to.eql(null) expect(typeof res.body).to.eql('object') expect(res.body.msg).to.eql('success') done() }) }) it('checks an updated object', function(done){ superagent.get('http://localhost:3000/collections/test/'+id) .end(function(e, res){ // console.log(res.body) 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.del('http://localhost:3000/collections/test/'+id) .end(function(e, res){ // console.log(res.body) expect(e).to.eql(null) expect(typeof res.body).to.eql('object') expect(res.body.msg).to.eql('success') done() }) }) })
테스트를 하기위해, $ mocha express.test.js 커맨드를 날릴 것이다. (모카를 전역으로 설치하지 않은 경우 $ ./node_modules/mocha/bin/mocha espress.test.js)
$ npm install express@4.1.1 --save $ npm install mongoskin@1.4.1 --save
$ npm install body-parser@1.0.2 --save
var express = require('express'), mongoskin = require('mongoskin'), bodyParser = require('body-parser')
3.x대 이후 버전(물론 v4도 마찬가지), Express.js은 앱 인스턴스의 객체를 간소화해서 가져온다, 아래 라인은 서버객체를 우리에게 제공할 것이다.(번역자:그냥 import정도로 생각하면 될듯):
var app = express()
요청의 바디로부터 파람들을 추출하기위해, 우리는 아래와같은 모양의 bodyParser() middleware를 사용할 것이다.:
app.use(bodyParser())
var db = mongoskin.db('mongodb://@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') })
이제 진짜 할 일을 시작한다. 다수의 요소들중에 리스트를 어떻게 가져오는지 있다 (첫번째 파라메터는 빈 오브젝트{}이고 임의의 라는 뜻이다). 이 결과는 _id에(두번째 파라메터) 의해 정렬된 10개 제한으로 낼 것이다. find()메소드는 커서를 반환하고 우리는 toArray()를 불러 JavaScript/Node.js용 배렬로 만든다. :
app.get('/collections/:collectionName', function(req, res, next) { req.collection.find({} ,{limit:10, sort: [['_id',-1]]}).toArray(function(e, results){ if (e) return next(e) res.send(results) }) })
app.get('/collections/:collectionName', function(req, res, next) { req.collection.find({} ,{limit:10, sort: [['_id',-1]]}).toArray(function(e, results){ if (e) return next(e) res.send(results) }) })
함수들을 구하는 findById나 findOne과같이 생긴 단일 객체는 find()보다 빠르다. 그러나 그것들은 조금 다른 인터페이스를 사용한다 (그것들은 커서 대신에 진짜 오브젝트를 반환한다). 그러므로 그것을 기억하고 있어라. 추가적으로, 우리는 Express.js 마법에 의해 req.params.id 경로의 :id 부분으로부터 ID를 가져올 것이다.
app.get('/collections/:collectionName/:id', function(req, res, next) { req.collection.findById(req.params.id, function(e, result){ if (e) return next(e) res.send(result) }) })
app.put('/collections/:collectionName/:id', function(req, res, next) { req.collection.updateById(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'}) }) })
마지막으로 DELETE HTTP 함수는 app.del()에 의해 실행된다. 요청 핸들러에서, 우리는 그것이 그 동작을 하는 것처럼 보이는 removeById()를 사용한다. 그리고 커스텀 JSON success 메시지를 제거과정에서 내보낼것이다.:
app.del('/collections/:collectionName/:id', function(req, res, next) { 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)
단지 이 경우 뭔가 잘 실행되지 않을 수 있다. 여기 express.js 파일의 풀 소스가 있다.
var express = require('express') , mongoskin = require('mongoskin') , bodyParser = require('body-parser') var app = express() app.use(bodyParser()) var db = mongoskin.db('mongodb://@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, next) { res.send('please select a collection, e.g., /collections/messages') }) app.get('/collections/:collectionName', function(req, res, next) { 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, next) { req.collection.insert(req.body, {}, function(e, results){ if (e) return next(e) res.send(results) }) }) app.get('/collections/:collectionName/:id', function(req, res, next) { req.collection.findById(req.params.id, function(e, result){ if (e) return next(e) res.send(result) }) }) app.put('/collections/:collectionName/:id', function(req, res, next) { req.collection.updateById(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.del('/collections/:collectionName/:id', function(req, res, next) { req.collection.removeById(req.params.id, function(e, result){ if (e) return next(e) res.send((result===1)?{msg:'success'}:{msg:'error'}) }) }) app.listen(3000)코드를 저장하고 당신의 에디터를 닫아라, 우리의 소박한 Express.js REST API 서버가 완성되었다.
$ node express.js
그리고 다른 창에서 아래 명령을 쳐라(처음 창은 닫으면 안된다):
$ mocha express.test.js
혹은 모카를 전역으로 설치 하지 않은 경우.:
$ ./node_modules/mocha/bin/mocha express.test.js
$ curl -X POST -d "name=azat" http://localhost:3000/collections/test13
그리고 결과는 아래처럼 나오게 될 것이다.:
{"name":"azat","_id":"535e180dad6d2d2e797830a5"}]
우리는 REST API 서버를 사용하기때문에 쉽게 이 객체를 확인할 수 있다.:
$ curl http://localhost:3000/collections/test13
> db.test13.find()
- Practical Node.js: Building Real-world Scalable Web Apps
- Express.js Guide: The Comprehensive Book On Express.js
연관 글
[Node.js, MongoDB] Node.js 설치 및 실행
[Node.js, MongoDB] MongoDB 리눅스에 설치 및 실행
[Node.js, MongoDB] MongoDB 돌리기 (+백그라운드에서 돌리기)
'그 외 > 서버 관련' 카테고리의 다른 글
(번역) Node.js의 핵심 디자인 패턴들 (0) | 2015.07.26 |
---|---|
[nodejs] 5분만에 서버 푸시 날리기 완성 to iOS, android (0) | 2015.07.05 |
[Node.js, MongoDB] MongoDB 돌리기 (+백그라운드에서 돌리기) (0) | 2015.05.13 |
[Node.js, MongoDB] MongoDB 리눅스에 설치 및 실행 (0) | 2015.05.13 |
[Node.js, MongoDB] Node.js 설치 및 실행 (0) | 2015.05.13 |
WRITTEN BY
- tucan.dev
개인 iOS 개발, tucan9389