में एक रीस्टफुल एपीआई बनाने के लिए कैसे करें मैं नोड (और आम तौर पर सभी बैक-एंड वेब विकास) में एक नौसिखिया हूं, और मैंने नोड में एक रीस्टफुल एपीआई लिखना शुरू कर दिया है। कुछ चीजें हैं जो मैं अपने सिर को पाने की कोशिश कर रहा हूं।Node.js
मेरा एप्लिकेशन एक्सप्रेस और मोंगोस का उपयोग करता है, और मैं एपीआई संसाधनों के लिए आसानी से अपने सीआरयूडी मार्ग बनाने के लिए express-resource
मॉड्यूल का उपयोग कर रहा हूं। लेकिन कुछ ऐसी चीजें हैं जिनसे मैं नाखुश हूं, और सोचता हूं कि मैं बेहतर कर सकता हूं।
पहला मोंगोस है। अगर मैं अपने एपीआई के लिए परीक्षण लिखना चाहता हूं, तो मेरे पास मोंगोस को मेमोरी डेटा में मजबूर करने के लिए कोई रास्ता नहीं है। हालांकि, वहां सभी ट्यूटोरियल मोंगोस को इंगित करते हैं, और मुझे सच में यकीन नहीं है कि मुझे क्या उपयोग करना चाहिए।
दूसरा, मेरे संसाधन में बहुत सारे बॉयलरप्लेट कोड हैं। क्या यह वास्तव में Node.js में एक विश्वसनीय API बनाने का सबसे अच्छा तरीका है? क्या ऐसे अन्य मॉड्यूल हैं जो मुझे सीआरयूडी मार्ग बनाने में मदद करेंगे? मेरा मानना है कि ऐसे तरीके हैं जिनसे आप बिना किसी कोड के अपने स्कीमा से सीआरयूडी मार्ग बना सकते हैं, लेकिन मुझे सच में यकीन नहीं है कि कैसे।
मैंने टॉवर.जेएस और कंपाउंडजेएस (औपचारिक रूप से रेलवेजेएस) जैसी परियोजनाएं देखी हैं जो ये व्यापक समाधान हैं जो यहां मेरे मुद्दों से कहीं अधिक हल करती हैं। शायद मुझे उनका उपयोग करना चाहिए, लेकिन मैं वास्तव में केवल Node.js एप्लिकेशन को एपीआई बनाना चाहता हूं और कुछ भी नहीं। मैं एपीआई के स्वतंत्र रूप से फ्रंट एंड से निपट रहा हूं।
कुछ संदर्भ प्रदान करने के लिए, यहां मेरी वर्तमान स्थिति है। वर्तमान में, मैं एक मॉडल नेवला में परिभाषित किया है:
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()
})
}
अंत में
, मैं आवश्यक CRUD के लिए इन नियंत्रकों मैप करने के लिए express-resource
मॉड्यूल का उपयोग एक्सप्रेस ऐप के शीर्ष पर मार्ग।
app.resource('api/links', require('../resources/links'))
नोड-रेस्टफुल और मेर्स साझा करने के लिए धन्यवाद। दोनों अच्छे लग रहे हैं। आप क्यों कहते हैं कि मुझे आराम करना चाहिए? ऐसा लगता है कि एक्सप्रेस जितना करता है उतना ही करता है, अगर कम नहीं होता ... मुझे यकीन नहीं है कि यह कैसे मदद करता है। अगर आप समझा सकते हैं तो यह अच्छा होगा! –
मैंने आराम के बारे में अच्छी बातें सुनी हैं, लेकिन इसे देखने के बाद ऐसा लगता है कि यह वास्तव में आपके लिए सीआरयूडी संचालन उत्पन्न नहीं करता है। ऐसा लगता है कि मर्स शायद सबसे अच्छा विकल्प होगा। – Benoir
धन्यवाद। मैं यह प्रश्न देखने के लिए अभी खुला हूं कि मुझे कोई अन्य सुझाव मिल रहा है या नहीं। –