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

tho*_*uts 17 rest mongoose mongodb node.js express

我正在使用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);
});
Run Code Online (Sandbox Code Playgroud)

-

// 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);
  });
};
Run Code Online (Sandbox Code Playgroud)

显然,到目前为止只实施了几种方法.你们怎么看待这种方法?我还能改进什么吗?

另外,一个小问题:我必须在每个API资源文件中要求mongoose(比如api\kitten.js,有没有办法在app.js文件中全局要求它或什么?

任何输入都非常感谢!

Sus*_*pta 13

那么,您可以在不同的文件中分离您的路由,数据库模型和模板.有一个像这样的目录结构,

| your_app
| -- routes
| -- models
| -- templates
| -- static
    | -- css
    | -- js
    | -- images
| -- config.js
| -- app.js
| -- url.js
Run Code Online (Sandbox Code Playgroud)
  • 对于每个Mongoose模型都有一个单独的文件放在你的 ./models
  • 在模板目录中放置您的玉器文件.(假设您使用jade作为模板引擎).虽然看起来你只是提供JSON,而不是HTML.如果要呈现HTML,请考虑使用Jade.(这里有一些你可以考虑使用的其他模板引擎)
  • ./static 静态JS,CSS和XML文件等的目录
  • 像db连接或第三方API密钥和东西之类的东西可以放在config.js中
  • 在url.js具有采取明确的程序app对象作为参数并且在延伸app.getapp.post存在于单一的地方.

PS这是我在快递中使用基本Web应用程序的方法.我绝不是说这是最好的方法,但它有助于我维护我的代码.


hbo*_*lan 6

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

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

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


Kun*_*dia 5

正如codemonger5所说,没有正确的组织目录结构的方法.

但是,您可以使用样板应用程序使用Express和使用ES6的mongoose创建REST API.我们在生产API服务中使用相同的目录结构.

git clone https://github.com/KunalKapadia/express-mongoose-es6-rest-api
cd express-mongoose-es6-rest-api
npm install
npm start
Run Code Online (Sandbox Code Playgroud)