2013-09-03 85 views
17

Tôi đang xây dựng một API REST với việc sử dụng NodeJS (Mongoose & ExpressJS). Tôi nghĩ rằng tôi có một cấu trúc cơ bản khá tốt vào lúc này, nhưng tôi tự hỏi thực hành tốt nhất là gì cho loại dự án này.Cấu trúc API ExpressJS & Mongoose REST: các phương pháp hay nhất?

Trong phiên bản cơ bản này, mọi thứ đều đi qua tệp app.js. Mỗi phương thức HTTP sau đó được chuyển đến tài nguyên đã được yêu cầu. Điều này cho phép tôi tự động thêm tài nguyên vào API và mọi yêu cầu sẽ được chuyển theo đó. Để minh họa:

// app.js 

var express = require('express'); 
var mongoose = require('mongoose'); 

var app = express(); 
app.use(express.bodyParser()); 

mongoose.connect('mongodb://localhost/kittens'); 
var db = mongoose.connection; 

var resources = [ 
    'kitten' 
]; 

var repositories = {}; 

for (var i = 0; i < resources.length; i++) { 
    var resource = resources[i]; 
    repositories[resource] = require('./api/' + resource); 
} 

db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function callback() { 
    console.log('Successfully connected to MongoDB.'); 

    app.get('/:resource', function (req, res) { 
    res.type('application/json'); 
    repositories[req.params.resource].findAll(res); 
    }); 

    app.get('/:resource/:id', function (req, res) { 
    res.type('application/json'); 
    repositories[req.params.resource].findOne(req, res); 
    }); 

    app.listen(process.env.PORT || 4730); 
}); 

-

// api/kitten.js 

var mongoose = require('mongoose'); 

var kittenSchema = mongoose.Schema({ 
    name: String 
}); 

var Kitten = mongoose.model('Kitten', kittenSchema); 

exports.findAll = function (res) { 
    Kitten.find(function (err, kittens) { 
    if (err) { 
    } 
    res.json(kittens); 
    }); 
}; 

exports.findOne = function (req, res) { 
    Kitten.findOne({ _id: req.params.id}, function (err, kitten) { 
    if (err) { 
    } 
    res.json(kitten); 
    }); 
}; 

Rõ ràng, chỉ có một vài phương pháp đã được thực hiện cho đến nay. Các bạn nghĩ sao về cách tiếp cận này? Bất cứ điều gì tôi có thể cải thiện?

Ngoài ra, một bên câu hỏi nhỏ: Tôi phải đòi hỏi cầy mangut trong mỗi tập tin tài nguyên API (như trong api\kitten.js, là có một cách để chỉ toàn cầu đòi hỏi nó trong file app.js hoặc một cái gì đó

Bất kỳ đầu vào? được đánh giá rất nhiều!

Trả lời

13

Vâng, bạn có thể tách ra khỏi tuyến đường của bạn, các mô hình db và các mẫu trong các tập tin khác nhau. có một cái gì đó cấu trúc thư mục như thế này,

| your_app 
| -- routes 
| -- models 
| -- templates 
| -- static 
    | -- css 
    | -- js 
    | -- images 
| -- config.js 
| -- app.js 
| -- url.js 
  • Đối với mỗi mẫu Mongoose có một tệp riêng được đặt trong ./models
  • Trong thư mục mẫu, hãy đặt các tệp ngọc bích của bạn. (Giả sử bạn đang sử dụng ngọc bích làm công cụ tạo mẫu của bạn). Mặc dù có vẻ như bạn chỉ đang phân phát JSON chứ không phải HTML. Xem xét sử dụng Jade nếu bạn muốn hiển thị HTML. (Dưới đây là vài khác template engines bạn có thể xem xét việc đi với)
  • ./static thư mục cho JS tĩnh, CSS và các tập tin XML, vv
  • Những thứ như kết nối db hoặc phím bên API thứ 3 và thứ có thể được đặt trong config.js
  • Trong url.js có một thủ tục nhận đối tượng app thể hiện dưới dạng đối số và mở rộng theo số app.getapp.post ở đó ở một nơi.

P.S. Đây là cách tiếp cận mà tôi sử dụng cho một ứng dụng web cơ bản. Tôi không có cách nào nói đây là cách tốt nhất để làm theo, nhưng nó giúp tôi duy trì mã của mình.

6

Không có đúng cách, nhưng tôi đã tạo một ứng dụng hạt giống cho cấu trúc thư mục cá nhân của mình để giúp bạn cùng phòng với điều này.

Bạn có thể sao chép nó: git clone https://github.com/hboylan/express-mongoose-api-seed.git

Hoặc với NPM: npm install express-mongoose-api-seed

5

Như codemonger5 nói không có cách nào phải tổ chức cấu trúc thư mục.

Tuy nhiên, bạn có thể sử dụng this ứng dụng bản mẫu để tạo các API REST bằng Express và mongoose bằng ES6. Chúng tôi sử dụng cùng một cấu trúc thư mục trong các dịch vụ API sản xuất của chúng tôi.

git clone https://github.com/KunalKapadia/express-mongoose-es6-rest-api 
cd express-mongoose-es6-rest-api 
npm install 
npm start