45 votes

Comment créer au mieux une API RESTful dans Node.js

Je suis débutant dans le Nœud (et généralement toutes les de développement web), et j'ai commencé à écrire une API RESTful dans le Nœud. Il y a quelques choses que je vais essayer d'obtenir ma tête autour de.

Mon application utilise l'Express et de la Mangouste, et je suis en utilisant l' express-resource module pour créer facilement mon CRUD routes pour l'API de ressources. Mais il ya un couple de choses que je suis malheureux, et de penser que je pouvais faire mieux.

La première est la Mangouste. Si je veux écrire des tests pour mon API, je n'ai aucun moyen de buter Mangouste pour le forcer à dans la mémoire de données. Tous les tutoriaux, il semble qu'au point de Mangouste, cependant, et je ne suis vraiment pas sûr de ce que je devrais être en utilisant.

Deuxièmement, ma ressource semble avoir beaucoup de code réutilisable. Est-ce vraiment la meilleure façon de créer une API RESTful dans Node.js? Il existe d'autres modules qui vont m'aider à créer mon CRUD des routes? Je crois qu'il ya des façons dont vous pouvez créer CRUD itinéraires à partir de votre schéma, sans plus de code, mais je ne suis vraiment pas sûr de savoir comment.

J'ai vu des projets en cours tels que Tower.js et CompoundJS (officiellement RailwayJS) qui semblent être ces solutions complètes qui permettent de résoudre beaucoup plus que mes questions ici. Peut-être que je devrais être à les utiliser, mais je n'ai vraiment envie de l'Node.js application à une API et rien de plus. Je fais affaire avec le front-end indépendamment de l'API.

Pour fournir un certain contexte, voici ma situation actuelle. Actuellement, j'ai un modèle défini dans la Mangouste:

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')

Ensuite, je définis les contrôleurs pour le CRUD itinéraires:

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()
  })
}

Enfin, j'utilise l' express-resource module à la carte ces contrôleurs de la nécessaire CRUD sur les routes du haut de l'Express app.

app.resource('api/links', require('../resources/links'))

29voto

Benoir Points 831

Vous devriez regarder dans Restify

Si vous voulez utiliser express, vous pouvez également consulter ce projet que j'ai réalisé - appelé node-reposful .

Cette bibliothèque semble être beaucoup plus mature et avoir plus de fonctionnalités: https://github.com/jspears/mers

5voto

noducks Points 821

Strongloop Loopback est une autre bonne solution pour générer des API Node / MongoDB. Il peut également générer des tests de moka .

2voto

wprl Points 6139

Je recommande Baucis + Express. Des milliers d'utilisateurs, une conception basée sur le modèle basée sur Mongoose, très flexible, conforme aux spécifications, compatible HATEOAS / Level 3. Convient parfaitement à tous mes besoins. Mais alors, je suis l'auteur :) https://github.com/wprl/baucis

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X