Подтвердить что ты не робот

Структура API ExpressJS & Mongoose REST: лучшие практики?

Я создаю REST API с использованием NodeJS (Mongoose и ExpressJS). Я думаю, что у меня довольно хорошая базовая структура на данный момент, но мне интересно, какие лучшие практики для этого проекта.

В этой базовой версии все проходит через файл app.js. Затем каждый HTTP-метод передается запрашиваемому ресурсу. Это позволяет мне динамически добавлять ресурсы в API, и каждый запрос будет передан соответствующим образом. Чтобы проиллюстрировать:

// 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);
  });
};

Очевидно, что до сих пор было реализовано всего несколько методов. Что вы, ребята, думаете об этом подходе? Что я могу улучшить?

Кроме того, небольшой вопрос: я должен требовать mongoose в каждом файле ресурсов API (например, в api\kitten.js, есть ли способ просто глобально потребовать его в файле app.js или что-то в этом роде?

Приветствуется любой вход!

4b9b3361

Ответ 1

Ну, вы можете выделить свои маршруты, модели db и шаблоны в разных файлах. Создайте структуру каталогов примерно так:

| your_app
| -- routes
| -- models
| -- templates
| -- static
    | -- css
    | -- js
    | -- images
| -- config.js
| -- app.js
| -- url.js
  • Для каждой модели Mongoose есть отдельный файл, помещенный в ваш ./models
  • В каталоге шаблонов разместите свои нефритовые файлы. (Предполагая, что вы используете нефрит в качестве механизма шаблонов). Хотя кажется, что вы только обслуживаете JSON, а не HTML. Подумайте об использовании Jade, если хотите визуализировать HTML. (Вот несколько других механизмов шаблонов, с которыми вы можете поговорить)
  • ./static для статических файлов JS, CSS и XML и т.д.
  • Такие вещи, как соединения db или сторонние ключи API и прочее, можно поместить в config.js
  • В url.js есть процедура, которая выражает объект app как аргумент и распространяется на app.get и app.post там в одном месте.

P.S. Это подход, который я использую для основного веб-приложения в экспресс. Я никоим образом не говорю, что это лучший способ следовать, но он помогает мне поддерживать мой код.

Ответ 2

Нет правильного пути, но я создал приложение-семестр для моей личной структуры каталогов, чтобы помочь моему соседу по комнате с этим.

Вы можете клонировать его: git clone https://github.com/hboylan/express-mongoose-api-seed.git

Или с npm: npm install express-mongoose-api-seed

Ответ 3

Так как codemonger5 сказал, что нет правильного способа организации структуры каталогов.

Однако вы можете использовать это шаблонное приложение для создания REST API с использованием Express и mongoose с использованием ES6. Мы используем ту же структуру каталогов в наших сервисных API-сервисах.

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