ExpressJS和Mongoose REST API结构:最佳实践?

18

我正在使用NodeJS(Mongoose和ExpressJS)构建REST API。我认为目前我有一个相当好的基本结构,但我想知道这种项目的最佳实践是什么。

在这个基本版本中,所有内容都会通过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);
  });
};

显然,到目前为止只实现了少数几种方法。你们觉得这个方法怎么样?有什么可以改进的地方吗?

另外,还有一个小问题:我必须在每个API资源文件中要求mongoose(就像在api\kitten.js中一样),是否有一种方法可以在app.js文件中全局要求它?

非常感谢任何意见!

3个回答

14

你可以将路由、数据库模型和模板分别存放在不同的文件中。目录结构可以像这样:

| your_app
| -- routes
| -- models
| -- templates
| -- static
    | -- css
    | -- js
    | -- images
| -- config.js
| -- app.js
| -- url.js
  • 每个Mongoose模型都需要单独放在./models目录下的一个文件中。
  • 在模板目录中放置你的jade文件。(假设你使用jade作为模板引擎)。尽管看起来你只提供JSON,而不是HTML。如果你想渲染HTML,请考虑使用Jade。(这里有一些其他可供考虑的模板引擎)。
  • ./static目录用于存放静态JS、CSS和XML等文件。
  • 类似数据库连接或第三方API密钥等内容可以放在config.js文件中。
  • 在url.js文件中,在单个地方拥有一个接受express app对象作为参数并在其中扩展app.getapp.post的过程。

附言:这是我在Express中编写基本Web应用程序的方法。我并不是说这是要遵循的最佳方式,但它有助于我维护我的代码。


6
如codemonger5所说,没有一种正确的组织目录结构的方式。
然而,您可以使用这个样板应用程序来创建使用Express和mongoose使用ES6的REST API。我们在生产API服务中使用相同的目录结构。
git clone https://github.com/KunalKapadia/express-mongoose-es6-rest-api
cd express-mongoose-es6-rest-api
npm install
npm start

6

没有“正确”的方法,但是我为我的个人目录结构创建了一个种子应用程序,以帮助我的室友。

您可以克隆它:git clone https://github.com/hboylan/express-mongoose-api-seed.git

或使用npm:npm install express-mongoose-api-seed


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接