如何在Node.js中最好地创建RESTful API

45 architecture api mongodb node.js express

我是Node(通常是所有后端Web开发)的初学者,我已经开始在Node中编写RESTful API.我正试图解决一些问题.

我的应用程序使用Express和Mongoose,我正在使用该express-resource模块轻松创建API资源的CRUD路由.但有一些我不满意的事情,并认为我可以做得更好.

第一个是猫鼬.如果我想为我的API编写测试,我无法将Mongoose存根到内存数据中.然而,所有的教程似乎都指向Mongoose,我真的不确定我应该使用什么.

其次,我的资源似乎有很多样板代码.这真的是在Node.js中创建RESTful API的最佳方式吗?还有其他模块可以帮助我创建我的CRUD路线吗?我相信有一些方法可以直接从你的架构创建CRUD路由,而不再需要代码,但我真的不确定如何.

我见过那些项目,比如Tower.js和CompoundJS(正式的RailwayJS)似乎是这些全面的解决方案,解决的问题远远超过我的问题.也许我应该使用它们,但我真的只希望Node.js应用程序成为API而已.我独立于API处理前端.

为了提供一些背景,这是我目前的情况.目前,我有一个在Mongoose中定义的模型:

var mongoose = require('mongoose')
  , Schema = mongoose.Schema
  , Link

var LinkSchema = new Schema({
  uri: String,
  meta: {
    title: String,
    desc: String
  },
  shares: [{
    uid: Schema.Types.ObjectId,
    date: Date,
    message: String
  }]
})

Link = module.exports = mongoose.model('Link')
Run Code Online (Sandbox Code Playgroud)

接下来,我为CRUD路由定义控制器:

var mongoose = require('mongoose')
  , _ = require('underscore')
  , Link = mongoose.model('Link')

exports.load = function (req, id, fn) {
  Link.findById(req.params.link, function (err, link) {
    if (err) {
      return res.send(err)
    }

    fn(null, link)
  })
}

exports.index = function (req, res) {
  var filterByUser = req.query.user ? { 'shares.uid': req.query.user } : {}

  Link.find(filterByUser, function (err, links) {
    if (err) {
      return res.send(err)
    }

    res.send(links)
  })
}

exports.create = function (req, res) {
  var link = new Link(req.body)

  link.save(function (err) {
    if (err) {
      // TODO: send 404
      return res.send(err)
    }

    res.send(link)
  })
}

exports.show = function (req, res) {
  res.send(req.link)
}

exports.update = function (req, res) {
  req.link = _(req.link).extend(req.body)

  req.link.save(function (err, link) {
    if (err) {
      return res.send(err)
    }

    res.send(link)
  })
}

exports.patch = exports.update

exports.destroy = function (req, res) {
  req.link.remove(function (err) {
    if (err) {
      return res.send(err)
    }

    res.send()
  })
}
Run Code Online (Sandbox Code Playgroud)

最后,我使用该express-resource模块将这些控制器映射到Express应用程序顶部的必要CRUD路由.

app.resource('api/links', require('../resources/links'))
Run Code Online (Sandbox Code Playgroud)

Ben*_*oir 29

你应该考虑改善

如果你想使用express,你也可以查看我做的这个项目 - 称为node-restful.

这个库似乎更成熟,但有更多功能:https://github.com/jspears/mers


Sea*_*ory 5

Strongloop Loopback似乎是生成Node/MongoDB API的另一个好选择.它也可以生成mocha测试.