45

私はNode(および通常はすべてのバックエンドWeb開発)の初心者であり、NodeでRESTfulAPIの作成を開始しました。私が頭を動かそうとしていることがいくつかあります。

私のアプリケーションはExpressとMongooseを使用しており、express-resourceモジュールを使用してAPIリソースのCRUDルートを簡単に作成しています。しかし、私が不満に思っていることがいくつかあり、もっとうまくやれると思います。

最初はマングースです。APIのテストを作成したい場合、Mongooseをスタブしてメモリデータに強制する方法はありません。そこにあるすべてのチュートリアルはマングースを指しているようですが、私は本当に何を使うべきかわかりません。

第二に、私のリソースには多くの定型コードが含まれているようです。これは、Node.jsでRESTful APIを作成するための本当に最良の方法ですか?CRUDルートの作成に役立つ他のモジュールはありますか?コードを使わずに、スキーマから直接CRUDルートを作成する方法はあると思いますが、その方法はよくわかりません。

Tower.jsやCompoundJS(正式にはRailwayJS)など、ここでの私の問題よりもはるかに多くのことを解決する包括的なソリューションのように見えるプロジェクトを見てきました。おそらく私はそれらを使用する必要がありますが、実際にはNode.jsアプリケーションをAPIにするだけで、それ以上のものは必要ありません。APIとは独立してフロントエンドを扱っています。

いくつかのコンテキストを提供するために、これが私の現在の状況です。現在、私はマングースで定義されたモデルを持っています:

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

次に、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()
  })
}

最後に、express-resourceモジュールを使用して、これらのコントローラーをExpressアプリの上部にある必要なCRUDルートにマップします。

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

14 に答える 14

29

あなたはrestifyを調べる必要があります

Expressを使用したい場合は、私が作成したこのプロジェクト(node-restfulと呼ばれる)も確認できます。

このライブラリははるかに成熟していて、より多くの機能を備えているようです:https ://github.com/jspears/mers

于 2013-02-20T23:02:29.040 に答える
5

ストロングループ ループバックは、Node/MongoDB API を生成するためのもう 1 つの優れた代替手段のようです。モカテストも生成できます。

于 2014-10-07T20:33:35.873 に答える
4

Strapiは新しい (2015) フレームワークです。

Web サイトの管理インターフェイスを使用すると、API を作成し、モデル間の関係を指定できます。(紹介動画でもご覧いただけます。)

ただし、Express ではなく、Koa サーバーで実行するように設計されています。

于 2016-01-29T10:54:34.490 に答える
2

これをチェックしてください: ここに画像の説明を入力

Feathers を使用すると、数分でプロトタイプを構築し、数日で本番環境に対応したリアルタイム バックエンドと REST API を構築できます。真剣に。

于 2016-12-24T01:57:35.377 に答える
2

Baucis + Express をお勧めします。数千人のユーザー、Mongoose に基づくモデル駆動型設計、非常に柔軟、仕様に準拠、HATEOAS/レベル 3 対応。私のすべてのニーズに完全に適合します。しかし、私は著者です:) https://github.com/wprl/baucis

于 2014-10-20T20:12:02.453 に答える
0

https://hivepod.io/を試して、完全な MEAN スタックでサンプルを生成してください。Hivepod は BaucisJS + ExpressJS + MongoDB + AngularJS の上に構築されます。

免責事項: 私は Hivepod の構築に取り組んでいます。

于 2015-12-15T14:41:26.150 に答える
0

このリンクを見てください

このプロジェクトは、ASP.Net WebApi 2.0 が続く同じプロジェクト アーキテクチャを使用してビルドされます。つまり、最初にコントローラー、認証メカニズムなどを用意することになります。独自のコントローラーを作成するだけです。

于 2016-06-10T06:40:46.373 に答える
0

誰もNodalについて言及していないことに驚いています。

ウェブサイトから:

Nodal は Node.js 用の Web サーバーであり、API サービスを迅速かつ効率的に構築するために最適化されています。

独自の独自の、明確で、慣用的で、拡張性の高いフレームワークを誇​​る Nodal は、あなたとあなたのチームの難しい決定をすべて処理します。これにより、技術的負債を最小限に抑えながら、短期間で効果的な製品を作成することに集中できます

積極的にメンテナンスされており、Github で 3800 以上のスターがあり (執筆時点)、ボイラープレート コードを生成するためのコマンドライン ツールが組み込まれており、全体的に作業が迅速に完了します。

于 2016-12-05T01:33:18.150 に答える
-1
    var mongoose        = require('../DBSchema/SchemaMapper');
    var UserSchema      = mongoose.model('User');

    var UserController = function(){
        this.insert = (data) => {
            return new Promise((resolve, reject) => {
                var user = new UserSchema({
                    userName: data.userName,
                    password: data.password
                });
                user.save().then(() => {
                    resolve({status: 200, message: "Added new user"});
                }).catch(err => {
                    reject({status: 500, message: "Error:- "+err});
                })
            })

        }

        this.update = (id, data) => {
            return new Promise((resolve, reject) => {
                UserSchema.update({_id: id}, data).then(() => {
                    resolve({status: 200, message: "update user"});
                }).catch(err => {
                    reject({status: 500, message: "Error:- " + err});
                })
            })
        }

        this.searchAll = () => {
            return new Promise((resolve, reject) => {
                UserSchema.find().exec().then((data) => {
                    resolve({status: 200, data: data});
                }).catch(err => {
                    reject({status: 500, message: "Error:- " + err});
                })
            })
        }

        this.search = (id) => {
            return new Promise((resolve, reject) => {
                UserSchema.find({_id:id}).exec().then(user => {
                    resolve({status: 200, data: user});
                }).catch(err => {
                    reject({status: 500, message: "Error:- " + err});
                })
            })
        }

        this.delete = (id) => {
            return new Promise((resolve, reject) => {
                UserSchema.remove({_id:id}).then(() => {
                    resolve({status: 200, message: "remove user"});
                }).catch(err => {
                    reject({status: 500, message:"Error:- " + err});
                })
            })
        }
    }

    module.exports = new UserController();

    ///Route
    var express     = require('express');
    var router      = express.Router();
    var Controller  = require('./User.Controller');



    router.post('/', (req, res) => {
        Controller.insert(req.body).then(data => {
            res.status(data.status).send({message: data.message});
        }).catch(err => {
            res.status(err.status).send({message: err.message});
        })
    });

    router.put('/:id', (req, res) => {
        Controller.update(req.params.id, req.body).then(data => {
            res.status(data.status).send({message: data.message});
        }).catch(err => {
            res.status(err.status).send({message: err.message});
        })
    });

    router.get('/', (req, res) => {
        Controller.searchAll().then(data => {
            res.status(data.status).send({data: data.data});
        }).catch(err => {
            res.status(err.status).send({message: err.message});
        });
    });

    router.get('/:id', (req, res) => {
        Controller.search(req.params.id).then(data => {
            res.status(data.status).send({data: data.data});
        }).catch(err => {
            res.status(err.status).send({message: err.message});
        });
    });

    router.delete('/:id', (req, res) => {
        Controller.delete(req.params.id).then(data => {
            res.status(data.status).send({message: data.message});
        }).catch(err => {
            res.status(err.status).send({message: err.message});
        })
    })

    module.exports = router;

//db`enter code here`schema

var mongoose = require('mongoose');
const Schema = mongoose.Schema;

var Supplier =new Schema({

    itemId:{
        type:String,
        required:true
    },
    brand:{
        type:String,
        required:true
    },
    pno:{
        type:String,
        required:true
    },   
    email:{
        type:String,
        required:true
    }    

});

mongoose.model('Inventory',Inventory);
mongoose.model('Supplier',Supplier);

mongoose.connect('mongodb://127.0.0.1:27017/LAB', function (err) {
    if (err) {
        console.log(err);
        process.exit(-1);
    }
    console.log("Connected to the db");
});
module.exports = mongoose;
于 2018-06-08T02:01:01.213 に答える