构建处理 MongoDB 查询的 Express 路由的最佳实践

adk*_*kan 3 database mongodb node.js express

我正在构建一个 RESTful 服务,用于使用Express.jsNode.jsMongoDB查询电影数据库 ,而且我是所有这些的初学者。

我的问题是使用 Node 构建 db 查询的最佳实践是什么,以便我利用回调机制而不阻塞服务器,但同时不编写臃肿的代码。

我修改了 express-generator 提供的代码,我认为它实现了前者而不是后者。你有什么意见?

如果您能为处理数据库查询的 Express 路由提供通用框架,我将不胜感激。

下面是我的代码

var findMovie = function(db, callback, req, res) {
var path = req.path.split("\/");
var cursor = db.collection('movies').find({"_id" : ObjectId(path[path.length - 2])});

var query = [];
cursor.each(function(err, doc) {
    assert.equal(err, null);
    if (doc != null) {
        query.push(doc);
    } else {
        res.json(query);
        callback();
    }
});
Run Code Online (Sandbox Code Playgroud)

}

router.get('/movies/:id/info/', function(req, res, next){
MongoClient.connect(url, function(err, db) {
  assert.equal(null, err);
  findMovie(db, function() {
      db.close();
  }, req, res);
});
Run Code Online (Sandbox Code Playgroud)

});

小智 7

首先,如果你在节点中使用MongoDB的我一定会推荐使用猫鼬或其他对象的建模工具,它不是要容易得多本地驱动程序。

那么它可能看起来像这样:

/模型/用户.js

var mongoose =  require('mongoose');

var UserSchema = new mongoose.Schema({
    createdAt: {type: Date, default: Date.now},
    updatedAt: {type: Date, default: Date.now},
    email: {type: String, unique: true, required: true},
    password: {type: String, required: true},
    active: {type: Boolean, default: true},
    role: {type: String, default: 'user'},
    accessLevel: {type: Number, default: 1}
  }, {
    collection: 'users'  
});

module.exports = mongoose.model('User', UserSchema);
Run Code Online (Sandbox Code Playgroud)

/控制器/users.js

var User = require('../model/user');

exports.create (req, res, next) {
  var newUser = new User(req.body);

  newUser.save(function (err) {
      if (err)
        return next(err);
      res.json({
        message: 'User created'
      });
  });
}

exports.listAll (req, res, next) {
  User.find({}, function (err, users) {
      if (err)
        return next(err);
      res.json(users)
  });
}

exports.getById (req, res, next) {
  User.findById(req.params.id, function (err, user) {
      if (err)
        return next(err);
      res.json(user)
  });
}
Run Code Online (Sandbox Code Playgroud)

/routes/users.js

var controller = require('../controllers/users');
var router = require('express').Router();

router.route('/users')
  .post(controller.create)
  .get(controller.listAll)

router.route('/users/:id')
  .get(controller.getById)
  .delete(controller.remove)
Run Code Online (Sandbox Code Playgroud)