我正在构建一个RESTful服务,用于查询电影数据库 Express.js , Node.js 和 MongoDB ,我是所有这些人的初学者。
我的问题是使用Node构造数据库查询的最佳实践是什么,以便我利用回调机制而不是阻止服务器,但同时不编写膨胀代码。
我修改了快速生成器提供的代码,我认为它实现了前者而不是后者。你有什么意见?
如果您可以为处理数据库查询的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();
}
});
}
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);
});
});
答案 0 :(得分:4)
首先,如果你在节点i中使用mongoDB,肯定会建议使用mongoose或其他一些对象建模工具,它比原生驱动程序容易得多。
那么它可能看起来像这样:
/model/user.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);
/controllers/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)
});
}
/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)