我正在使用NodeJS(Mongoose&ExpressJS)构建一个restapi.我认为目前我有一个很好的基本 struct ,但我想知道这种项目的最佳实践是什么.

在这个基本版本中,所有内容都通过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文件或其他文件中全局要求它)?

非常感谢您的任何意见!

推荐答案

嗯,你可以在不同的文件中分离出你的路由、数据库模型和模板.

| your_app
| -- routes
| -- models
| -- templates
| -- static
    | -- css
    | -- js
    | -- images
| -- config.js
| -- app.js
| -- url.js
  • 对于每个mongoose 模型,请在您的./models中放置一个单独的文件
  • 在模板目录中放置您的jade文件.(假设您使用jade作为模板引擎).虽然看起来你只提供JSON,而不是HTML.如果想渲染HTML,请考虑使用杰德.(这里还有其他template engines个你可以考虑的)
  • ./static个静态JS、CSS和XML文件目录等.
  • db连接或第三方API密钥之类的东西可以放在配置中.js
  • 在url中.js有一个以express app对象为参数的过程,并在单个位置扩展到app.getapp.post.

另外,这是我在express中使用的基本web应用程序的方法.我并不是说这是最好的遵循方式,但它有助于我维护代码.

Mongodb相关问答推荐

会话的Mongo-go驱动程序版本.Copy()

在MongoDB查询中添加来自另一个集合的匹配文档的计数

MongoDB中的字符串聚合

字段$set聚合导致错误美元($)前缀字段$concatArrays对于存储无效"

如何在MongoSH中的现有文档中插入字段

MongoDB $lookup 查找字段值数组

避免在 MongoDB 聚合框架中使用 ISODate() 以便管道可以是纯 JSON

mongo:在 mongodb 6.0 docker 容器上找不到命令

Mongodb聚合查找连接两个对象字段的集合数组匹配对象索引字段的总和

Mongoose 返回包含属性内任何位置的值的所有文档

以聚合顺序使用 $$ROOT

你如何在 Kubernetes 上设置 Mongo 副本集?

Mongoose 与 mongodb 如何返回刚刚保存的对象?

Mongoose.js 通过一个 connect() 调用创建到 MongoDB 的多个连接

没有参考选项的mongoose填充字段

MongoDB 用 $type 匹配一个数组?

MongoError:failed to connect to server [localhost:27017] on first connect

在 MongoDB 中比较日期(moment.js)

我需要手动关闭mongoose连接吗?

Mongo 条件为key doesn't exist?