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.js와 action 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
'sourcecode' 카테고리의 다른 글
이클립스의 즉시 창 (0) | 2023.05.18 |
---|---|
WPF/C#로 IE WebBrowser 컨트롤 대신 Cromium을 포함하는 옵션 (0) | 2023.05.18 |
@Html을 호출합니다.부분: 다른 컨트롤러에 속하는 부분 뷰를 표시합니다. (0) | 2023.05.18 |
Windows 명령 프롬프트에서 ls를 생성하는 방법은 무엇입니까? (0) | 2023.05.18 |
SQL Server: 테이블의 최대 행 수 (0) | 2023.05.18 |