2013-02-20 43 views
43

Tôi là người mới bắt đầu trong Node (và nói chung là tất cả phát triển web back-end), và tôi đã bắt đầu viết một RESTful API trong Node. Có một vài điều tôi đang cố gắng để có được đầu của tôi xung quanh.Cách tạo tốt nhất một API RESTful trong Node.js

Ứng dụng của tôi sử dụng Express và Mongoose và tôi đang sử dụng mô-đun express-resource để dễ dàng tạo các tuyến đường CRUD của tôi cho tài nguyên API. Nhưng có một vài điều tôi không hài lòng, và nghĩ rằng tôi có thể làm tốt hơn.

Đầu tiên là Mongoose. Nếu tôi muốn viết các bài kiểm tra cho API của mình, tôi không có cách nào để làm gián đoạn Mongoose để ép nó vào dữ liệu bộ nhớ. Tất cả các hướng dẫn hiện có dường như chỉ đến Mongoose, tuy nhiên, và tôi thực sự không chắc chắn những gì tôi nên sử dụng.

Thứ hai, tài nguyên của tôi dường như có nhiều mã soạn sẵn. Đây có phải là cách tốt nhất để tạo một RESTful API trong Node.js không? Có các mô-đun khác sẽ giúp tôi tạo các tuyến đường CRUD của tôi không? Tôi tin rằng có những cách bạn có thể tạo các tuyến đường CRUD ngay từ lược đồ của bạn, mà không cần mã nữa, nhưng tôi thực sự không chắc chắn làm thế nào.

Tôi đã thấy các dự án ngoài đó như Tower.js và CompoundJS (chính thức RailwayJS) dường như là những giải pháp toàn diện giải quyết nhiều hơn vấn đề của tôi ở đây. Có lẽ tôi nên sử dụng chúng, nhưng tôi thực sự chỉ muốn ứng dụng Node.js là một API và không có gì hơn. Tôi đang giao dịch với front-end độc lập với API.

Để cung cấp một số ngữ cảnh, đây là tình huống hiện tại của tôi. Hiện nay, tôi có một mô hình quy định tại 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') 

Tiếp theo, tôi xác định các bộ điều khiển cho các tuyến đường 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() 
    }) 
} 

Cuối cùng, tôi sử dụng các mô-đun express-resource để lập bản đồ các bộ điều khiển để các CRUD cần thiết các tuyến đường ở trên cùng của ứng dụng Express.

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

Trả lời

29

Bạn nên nhìn vào restify

Nếu bạn muốn sử dụng nhanh, bạn cũng có thể kiểm tra dự án này mà tôi thực hiện - được gọi là node-restful.

Thư viện này có vẻ là nhiều hơn nữa trưởng thành và có nhiều tính năng hơn mặc dù: https://github.com/jspears/mers

+0

Cảm ơn bạn đã chia sẻ với các nút và những người bạn. Cả hai đều tốt. Tại sao bạn nói tôi nên sử dụng restify? Có vẻ như nó cũng giống như Express, nếu không ít hơn ... Tôi không chắc nó sẽ giúp ích như thế nào. Sẽ tốt nếu bạn có thể giải thích! –

+0

Tôi đã nghe những điều tốt đẹp về việc khôi phục, nhưng sau khi nhìn vào nó có vẻ như nó không thực sự tạo ra các hoạt động CRUD cho bạn. Có vẻ như mers có lẽ sẽ là lựa chọn tốt nhất. – Benoir

+0

Cảm ơn. Tôi sẽ để câu hỏi này mở ngay bây giờ để xem tôi có nhận được bất kỳ gợi ý nào khác không. –

5

Strongloop Loopback seeems là một lựa chọn tốt để tạo ra Node/MongoDB API. Nó cũng có thể tạo ra mocha tests.

+0

+! Loopback có giao diện web trên localhost để giúp thiết kế các mô hình của bạn và kiểm tra các tuyến được tạo. Đó là cơ sở dữ liệu bất khả tri, vì vậy bạn có thể sử dụng MongoDB hoặc MySQL đằng sau nó. Và nó cho phép bạn chỉ định [quy tắc ACL] (https://docs.strongloop.com/display/public/LB/Controlling+data+access) để đảm bảo người dùng chỉ có thể truy cập dữ liệu họ có quyền. – joeytwiddle

2

Tôi khuyên bạn nên sử dụng Baucis + Express. Hàng ngàn người dùng, thiết kế dựa trên mô hình dựa trên Mongoose, rất linh hoạt, tuân thủ đặc tả, HATEOAS/Level 3 đã sẵn sàng. Phù hợp với tất cả nhu cầu của tôi một cách hoàn hảo. Nhưng sau đó, tôi là tác giả :) https://github.com/wprl/baucis

4

Hãy xem Hapi khung cấu hình trung tâm để xây dựng các ứng dụng web và API được sử dụng làm dịch vụ an toàn.

tùy chọn khác là sails.jsactionhero

+1

Phải. Trên. Điều này đã mở ra một thế giới hoàn toàn mới cho tôi, một anh chàng Front-End. Cảm ơn Travis! – Cody

0

Hãy thử https://hivepod.io/ và tạo ví dụ của bạn trong ngăn xếp MEAN đầy đủ. Hivepod xây dựng trên đầu trang của BaucisJS + ExpressJS + MongoDB + AngularJS.

Tuyên bố từ chối trách nhiệm: Tôi làm việc xây dựng Hivepod.

3

Strapi là một khung (2015) mới.

Giao diện quản trị trên trang web của họ cho phép bạn tạo API và chỉ định mối quan hệ giữa các mô hình. (Như có thể thấy trong video giới thiệu của họ.)

Tuy nhiên, nó được thiết kế để chạy trên máy chủ Koa, chứ không phải trên Express.

0

Có một cái nhìn vào link

Dự án này này được xây dựng bằng cách sử dụng archutecture cùng một dự án mà được theo sau bởi ASP.Net WebAPI 2.0. Điều đó có nghĩa là nó sẽ có bộ điều khiển, cơ chế xác thực, vv để bắt đầu. Tất cả những gì bạn cần làm là tạo bộ điều khiển của riêng bạn.

0

Tôi ngạc nhiên khi không ai đề cập đến Nodal.

Từ trang web:

Nodal là một máy chủ web cho Node.js, tối ưu hóa cho việc xây dựng các dịch vụ API một cách nhanh chóng và hiệu quả.

Tự hào với khuôn khổ riêng tư, rõ ràng, thành ngữ và có khả năng mở rộng, Nodal sẽ chăm sóc mọi quyết định khó khăn cho bạn và nhóm của bạn. Điều này cho phép bạn tập trung vào việc tạo ra một sản phẩm hiệu quả trong một khoảng thời gian ngắn trong khi giảm thiểu nợ kỹ thuật

Nó được duy trì tích cực, có 3800+ ngôi sao trên Github (tại thời điểm viết bài), có một công cụ dòng lệnh được xây dựng- để tạo mã boilerplate và tổng thể hoàn thành công việc một cách nhanh chóng.

1

Kiểm tra này ra: enter image description here

Với Feathers bạn có thể xây dựng nguyên mẫu trong vài phút và sản xuất sẵn sàng backends real-time và REST API trong ngày. Nghiêm túc.

2

Đây là vấn đề về khuôn khổ hiện nay.

Khi bạn đến đây từ google tìm kiếm "tốt nhất", "nhanh nhất" khuôn khổ blah, blah, người ta sẽ thả một dòng nói "Hey, bạn nên cố gắng sails.js này, lông, Derby vv ..."

Ok Câu hỏi là: - Bạn có thích thú với các khung công tác đó không - nếu có, bạn có thể dễ dàng có được danh sách các khung công tác và sau đó bắt đầu chuẩn hóa chúng.

  • Tôi giả định hầu hết mọi người là "Tôi muốn xây dựng một sản phẩm, xây dựng một trang web có thể kiếm tiền trong tương lai hoặc ít nhất nó sẽ trở nên phổ biến";

Ok, tất cả từ khóa và chú ý tìm kiếm ở đây đều sai, cố gắng tìm kiếm "sẵn sàng sản xuất", "sẵn sàng cho doanh nghiệp", "nghiên cứu điển hình" những từ khóa đó hoặc có thể thực sự.com và tìm kiếm node.js, tìm hiểu sâu hơn về khung công việc mà hầu hết các công ty sử dụng, câu trả lời có thể chỉ đơn giản là nói "express".

nếu như vậy, Từ đống Node.js, Các khuôn khổ sẽ khá nhiều được thu hẹp xuống một vài trong số họ: Hapi, Strongloop, hoặc thậm chí không phổ biến một Mojito từ Yahoo

Đối Những khuôn khổ ít nhất bạn có thể nói - "Họ đang thực sự sản xuất hoặc doanh nghiệp sẵn sàng" - cos 'họ đã sử dụng hình thức Walmart, từ Yahoo, từ những gã khổng lồ lớn khác từ một thời gian, một số thậm chí trong vài năm.

Điều này có thể giải thích tại sao Ruby trên đường ray và Django vẫn thống trị toàn bộ thị trường khung ngăn xếp? thậm chí bạn còn thấy rất nhiều khung công tác "thú vị" đang tiếp tục tồn tại trên thị trường, Meteor, Sails.js, Revel của Go, Java's Spark Play bất kể bạn có thể đặt tên gì - Điều đó không có nghĩa là những khung công tác này tồi tệ hơn cả hai, để giành được thị trường.

Một vấn đề khác của khung công tác hiện tại là một loại tất cả-trong-một, bản sao của "Ror"; Từ khách hàng tiềm năng của người dùng cuối, họ chỉ cần một thứ để giúp họ hoàn thành công việc, cần sản xuất, cần một thứ gì đó để làm việc từ đầu đến cuối, như Ruby on Rails, như MacOS, giống như cửa sổ, giống như bất kỳ thứ gì đã được thử nghiệm vào thời điểm đó, đã được sử dụng hàng ngày bởi mọi người.

Các vấn đề liên quan