unhurried

コンピュータ関連ネタがほとんど、ときどき趣味も…

MEANスタックでREST APIを実装する

最近は社内でもNode.jsを利用するプロジェクトがちらほらあるので、少しずつ学習しています。 いくつかWeb上のチュートリアルを読んでなんとなくのイメージが掴めたので、まずは手始めにREST APIを作ってみました。 (ちなみにタイトルにはMEANスタックとありますが、今回はAngularJSは利用していません…。)

詰まったところはあまりありませんでしたが、 mongodbの動きがドキュメントと違うなぁと思っていたら、うっかり古いバージョンのものを参照していました。 最新は2.0系ですので、正しいドキュメントはこちらになります。 http://mongodb.github.io/node-mongodb-native/2.0/api/

var express = require('express');
var http = require('http');
var assert = require('assert');
var mongodb = require('mongodb');

var app = express();
app.set('port', process.env.PORT || 3000);
app.use(express.bodyParser());

// Connect to MongoDB todo collection.
var collection;
mongodb.MongoClient.connect('mongodb://localhost:27017/todo', function(error, db) {
    assert.equal(null, error);
    collection = db.collection("todo");
});

// APIs
app.post('/api/todos/', function(request, response) {
    var input = request.body;
    collection.insertOne(input, function(error, result) {
        assert.equal(null, error);
        var created = result.ops[0];
        response.status(201).send(created);
    });
});

app.get('/api/todos/:id/', function(request, response) {
    var todoId = request.params.id;
    collection.findOne({_id:mongodb.ObjectID(todoId)}, function(error, item) {
        assert.equal(null, error);
        if (item == null) response.status(404).send({error:"not_found"});
        response.status(200).send(item);
    });
});

app.put('/api/todos/:id/', function(request, response) {
    var todoId = request.params.id;
    var input = request.body;
    collection.updateOne({_id:mongodb.ObjectID(todoId)}, input, function(error, result) {
        assert.equal(null, error);
        if (result.result.nModified != 1) response.status(404).send({error:"no_found"});
    });
    collection.findOne({_id:mongodb.ObjectID(todoId)}, function(error, item) {
        assert.equal(null, error);
        if (item == null) response.status(404).send({error:"not_found"});
        response.status(200).send(item);
    });
});

app.delete('/api/todos/:id/', function(request, response) {
    var id = request.params.id;
    collection.deleteOne({_id:mongodb.ObjectID(id)}, function(error, result) {
        assert.equal(null, error);
        if (result.deletedCount == 0) response.status(404).send({error:"not_found"});
        response.status(200).send();
    });
});

app.get('/api/todos/', function(request, response) {
    var todoId = request.params.id;
    collection.find({}).toArray(function(error, items) {
        assert.equal(null, error);
        response.status(200).send(items);
    });
});

// Start the express server.
http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});