LoginSignup
14
16

More than 5 years have passed since last update.

JSON ファイルを出入力するだけの簡単な API をつくる ~Node.js/Express 編~

Last updated at Posted at 2014-06-30

目的

前回 Python で書いた JSON ファイルを出入力する API を Node.js に書き換える。

書いた

Python の Flask 代わりに Node.js の Express を使いました。
前回 Python で書いた API をそのまま Coffee に書き換えただけです。URI は 前回の と全く同じです。
非同期なので I/O のところを Deffered 使いましたが、あとでリファクタします。書いてみたけどあまりに美しくない...ƪ(•̃͡ε•̃͡)∫

※ write 時に副作用あるので注意。

fs = require 'fs'
_ = require 'underscore'
express = require 'express'
bodyParser = require 'body-parser'
deferred = require 'deferred'
app = express()
app.use(bodyParser())


DATA_PATH = './data/'


# Routing
app.get '/', (req, res) ->
  res.type('text/plain')
  res.send('hello:)')
  return


app.get '/api/:key', (req, res) ->
  key = req.params.key
  readModel(key)
  .then (data) ->
    if _.isNull(data)
      res.send('NOT FOUND')
    else
      res.type('application/json')
      res.json(data)
  , (err) ->
    res.send(err)
  return


app.post '/api/:key', (req, res, next) ->
  key = req.params.key
  if not _.isObject(req.body) then return res.send('INVALID DATA')
  readModel(key)
  .then (data) ->
    if _.isNull(data)
      data = {}
    resBody = _.extend(data, req.body)
    writeModel(key, JSON.stringify(resBody))
    .then (data) ->
      res.type('application/json')
      res.json(resBody)
    , (err) ->
      res.send(err)
  , (err) ->
    res.send(err)
  return


app.delete '/api/:key/:json_key', (req, res, next) ->
  key = req.params.key
  jsonKey = req.params.json_key
  if not _.isObject(req.body) then return res.send('INVALID DATA')
  readModel(key)
  .then (data) ->
    if _.isNull(data) or not _.has(data, jsonKey)
      res.send('NOT FOUND')
    resBody = _.omit(data, jsonKey)
    writeModel(key, JSON.stringify(resBody))
    .then (data) ->
      res.type('application/json')
      res.json(resBody)
    , (err) ->
      res.send(err)
  , (err) ->
    res.send(err)
  return


# I/O
readModel = (key) ->
  dfd = deferred()
  fileName = DATA_PATH + key + '.json'
  fs.readFile fileName, 'utf8', (err, data) ->
    if err
      return dfd.reject('I/O ERROR')
    resBody = JSON.parse(data)
    return dfd.resolve(resBody)
  return dfd.promise


writeModel = (key, data) ->
  dfd = deferred()
  fileName = DATA_PATH + key + '.json'
  fs.writeFile fileName, data, 'utf8', (err) ->
    if err
      return dfd.reject('I/O ERROR')
    return dfd.resolve(data)
  return dfd.promise


app.listen(process.env.PORT or 3000)

Github に置いた

14
16
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
16