sourcecode

Node.js에서 RESTful API를 가장 잘 만드는 방법

codebag 2023. 5. 18. 21:02
반응형

Node.js에서 RESTful API를 가장 잘 만드는 방법

저는 노드(그리고 일반적으로 모든 백엔드 웹 개발) 초보자이며 노드에서 RESTful API를 작성하기 시작했습니다.제가 머리를 돌리려고 노력하고 있는 것이 몇 가지 있습니다.

내 하고 있고, 나는 익스프레스와 몽구스를 .express-resource모듈을 사용하여 API 리소스에 대한 내 CRUD 경로를 쉽게 만들 수 있습니다.하지만 제가 불행하고 더 잘할 수 있다고 생각하는 몇 가지가 있습니다.

첫 번째는 몽구스입니다.API에 대한 테스트를 작성하려면 메모리 데이터에 Mongoose를 강제로 스텁할 방법이 없습니다.하지만 모든 튜토리얼이 Mongoose를 가리키는 것 같고, 무엇을 사용해야 할지 정말 잘 모르겠습니다.

두 번째로, 제 자원은 상용어구 코드가 많은 것 같습니다.이것이 Node.js에서 RESTful API를 만드는 가장 좋은 방법입니까?CRUD 경로를 만드는 데 도움이 되는 다른 모듈이 있습니까?코드 없이 스키마에서 바로 CRUD 경로를 만들 수 있는 방법이 있다고 생각합니다. 하지만 어떻게 해야 할지 잘 모르겠습니다.

저는 Tower.js와 CompoundJS(공식적으로는 Railway)와 같은 프로젝트를 보았습니다.JS) 이것이 제 문제보다 훨씬 더 많은 문제를 해결하는 포괄적인 솔루션인 것 같습니다.아마도 나는 그것들을 사용해야 할 것이지만, 나는 정말로 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')

다음으로 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'))

당신은 재검사를 검토해야 합니다.

express를 사용하고 싶다면, 제가 만든 node-restful이라는 프로젝트도 확인할 수 있습니다.

하지만 이 라이브러리는 훨씬 더 성숙하고 더 많은 기능을 가지고 있는 것 같습니다: https://github.com/jspears/mers

Strongloop Loopback은 Node/MongoDB API 생성을 위한 또 다른 좋은 대안으로 보입니다.모카 테스트도 생성할 수 있습니다.

Happi는 웹 애플리케이션 및 API를 구축하기 위한 구성 중심 프레임워크로, 휴식 서비스로 사용됩니다.

다른 옵션은 sails.jsaction hero입니다.

Strapi는 새로운 (2015) 프레임워크입니다.

그들의 웹사이트의 관리자 인터페이스를 통해 API를 생성하고 모델 간의 관계를 지정할 수 있습니다. (소개 동영상에서 확인할 수 있습니다.)

그러나 Express가 아닌 Koa 서버에서 실행되도록 설계되었습니다.

바우키스+익스프레스를 추천합니다.수천 명의 사용자, Mongoose 기반의 모델 기반 설계, 매우 유연하고 사양 준수, HATOAS/Level 3 지원.제 모든 요구에 완벽하게 들어맞습니다.하지만 그럼, 내가 저자야 :) https://github.com/wprl/baucis

다음을 확인하십시오.

Fuaters를 사용하면 몇 분 만에 시제품을 제작할 수 있으며, 며칠 내에 실시간 백엔드 및 REST API를 제작할 수 있습니다.진짜로.

오늘날 프레임워크에 대한 이슈가 있습니다.

구글 검색에서 "최고", "가장 빠른" 프레임워크 blah, blah, 사람들은 "야, 너는 이 돛, 깃털, 더비 등을 시도해야 해."라고 말할 것입니다.."

좋습니다. 질문은 다음과 같습니다. - 이러한 프레임워크를 재미로 사용하는 것입니까? - 만약 그렇다면 프레임워크 목록을 쉽게 얻을 수 있고 벤치마킹을 시작할 수 있습니다.

  • 저는 대부분의 사람들이 "제품을 만들고 싶다, 사이트를 만들고 싶다, 미래에 돈을 벌 수 있다, 아니면 적어도 그것이 대중화될 것이다"라고 생각합니다.

자, 여기서 키워드와 주의 사항을 검색하는 모든 것이 틀렸습니다. "운영 준비", "엔터프라이즈 준비", "사례 연구"를 검색해 보십시오. 또는 indeed.com 로 이동하여 node.js를 검색하여 대부분의 기업이 사용하는 node.js 프레임워크를 자세히 살펴보면 답은 단순히 "실행 준비"라고 말할 수 있습니다.

그렇다면 node.js 스택에서 프레임워크는 그 중 몇 가지로 좁혀질 것입니다.Hapi, Strongloop, 또는 Yahoo의 Mojito조차 인기가 없습니다.

이러한 프레임워크의 경우 적어도 "실제 생산 또는 엔터프라이즈 준비가 되어 있습니다."라고 말할 수 있습니다. 왜냐하면 그들은 월마트, 야후, 다른 거대 기업들로부터 언젠가, 심지어 몇 년 동안 사용해 왔기 때문입니다.

이것이 왜 Ruby on Rails와 Django가 여전히 풀 스택 프레임워크 시장을 지배하는지 설명할 수 있습니까?Meteor, Sails.js, Go's Revel, Java의 Play Spark와 같은 "멋진" 프레임워크가 시장에 계속 출시되는 것을 볼 수도 있습니다. 이는 두 가지보다 더 나쁜 프레임워크를 의미하는 것이 아니라 시장에서 이기기 위해 시간이 필요하다는 것을 의미합니다.

또 다른 문제는 현재 프레임워크의 많은 부분이 "Ror"를 복제한 올인원(All-In-One)입니다. 최종 사용자의 관점에서 볼 때, Ruby on Rails와 같은 MacOS와 같은, 시간에 따라 테스트된 모든 것과 같은, 처음부터 끝까지 작업할 수 있는 무언가가 필요합니다.사람들이 매일 사용해 왔습니다.

나는 Express를 사용하여 Node.js에서 RESTful API를 구축해 왔으며 Express 4에 Router가 추가되어 구조화가 훨씬 쉬워졌습니다.자세한 내용은 http://www.codekitchen.ca/guide-to-structuring-and-building-a-restful-api-using-express-4/ 를 참조하십시오.

https://hivepod.io/ 사용하여 전체 평균 스택에서 예제를 생성해 보십시오.Baucis 위에 Hivepod가 구축JS + 익스프레스JS + MongoDB + 각도제이에스

고지 사항:저는 하이브팟을 만드는 일을 합니다.

링크를 살펴보십시오.

이 프로젝트는 ASP.Net WebApi 2.0 다음에 나오는 동일한 프로젝트 아키텍처를 사용하여 빌드됩니다.즉, 처음부터 컨트롤러, 인증 메커니즘 등을 갖추게 됩니다.고유한 컨트롤러를 생성하기만 하면 됩니다.

아무도 노달을 언급하지 않은 것이 놀랍습니다.

웹 사이트에서:

Nodal은 Node.js용 웹 서버로, API 서비스를 빠르고 효율적으로 구축할 수 있도록 최적화되어 있습니다.

노달은 자신의 확고하고 명확하며 관용적이며 확장성이 높은 프레임워크를 자랑하며, 여러분과 여러분의 팀을 위해 모든 어려운 결정을 처리합니다.이를 통해 짧은 시간 내에 효과적인 제품을 만드는 데 집중하면서 기술적인 부채를 최소화할 수 있습니다.

적극적으로 유지보수되고, Github(작성 당시)에 3800개 이상의 별이 있고, 상용어구 코드를 생성하기 위한 명령 줄 도구가 내장되어 있으며, 전반적으로 작업이 신속하게 완료됩니다.

라이브러리 시스템에서 CRUD 작업을 수행하기 위한 샘플입니다.

var schema=require('../dbSchema');
var bookmodel=schema.model('book');

exports.getBooks = function (req,res) {
    bookmodel.find().exec().then((data)=>{
        res.send(data)
    }).catch((err)=>{
        console.log(err);
    });
};

exports.getBook = function (req,res) {
var bkName=req.params.Author;
bookmodel.find({Name:bkName}).exec().then((data)=>{
    res.send(data)
}).catch((err)=>{
    console.log(err);
});
};

exports.getAutBooks = function (req,res) {
    bookmodel.find({},'Author').then((data)=>{
        res.send(data);
    }).catch((err)=>{
    console.log(err);
    });
};

exports.deleteBooks=function(req,res){
    var bkName=req.params.name;
    bookmodel.remove({Name:bkName}).exec().then((data)=>{
        res.status(200);
        console.log(bkName);
    }).catch((err)=>{
        console.log(err);
    });
    };

exports.addBooks=function(req,res){
    var newBook=new bookmodel({
        Name:req.body.Name,
       ISBN:req.body.ISBN,
       Author:req.body.Author,
       Price:req.body.Price,
       Year:req.body.Year,
       Publisher:req.body.Publisher
    });
    newBook.save().then(()=>{
        res.status(201);
    }).catch((err)=>{
        console.log(err);
    });
};

저는 express의 열렬한 팬이며 구축하기 쉬운 Node.js에서 RESTful API를 구축하는 데 사용해 왔습니다.그러나 애플리케이션이 성장하기 시작했을 때 익스프레스 구조가 제대로 확장되지 않고 코드가 더 많이 분할되면서 유지 관리가 더 어려워졌습니다.

저는 SOLID 원칙이 많이 사용되는 C#/Java 배경에서 왔습니다.같은프워크와 같은 Java Spring / C# WebAPI엔터프라이즈급 애플리케이션을 만드는 것으로 입증되었습니다.의 C 스킬(C#/Java 스킬을 할 수 .reuse I mean MVC architecture, OOPS, SOLID, DI, Mocks ... yeah, strong typing도 제 사항()을 못했습니다 안타깝게도 제 요구사항에 맞는 프레임워크를 찾지 못했습니다(It should have less learning curve, minimalist codebase size, completely express compatible).

호환성을 완전히 표현한다는 것은 무엇을 의미합니까?익스프레스가 무엇을 하든지 간에, 내가 그 위에 프레임워크를 사용하더라도, 나는 그것을 할 수 있어야 한다, 내가 Strongloop Loopback을 조사했을 때, 그것은 꽤 사용하기 좋았지만, 그것은 거쳐야 할 문서가 많고 프레임워크는 결합되어 있다, 실제로 내가 찾던 것이 아닙니다.

그래서 나는 Typescript로 구동되는 Dinoloop을 만들었습니다 (has interfaces, classes, abstract classes and strong oops는 현재 패키지는 현재 상당히 안정적입니다.

Dinoloop을 사용하면 확장 가능한 아키텍처에서 엔터프라이즈급 애플리케이션을 구축할 수 있습니다.종속성 주입 프레임워크를 사용하지만 유형 스크립트에서 사용할 수 있는 모든 DI 프레임워크를 구성할 수 있습니다.하면 Typescript가 Dinoloop과 Nodejs REST 공통 데할 수 있습니다.angular그리고.node프로젝트

그래서 Dinoloop은 타자기 애호가들과 각진 개발자들에게 완벽하게 적합합니다.

    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;

언급URL : https://stackoverflow.com/questions/14990544/how-to-best-create-a-restful-api-in-node-js

반응형