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'))
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! –
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
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. –