【问题标题】:Abstracting Mongoose with Restify用 Restify 抽象 Mongoose
【发布时间】:2012-12-22 16:21:07
【问题描述】:

我很好奇是否有人可以提供一些关于抽象使用 Node.js + Restify + Mongoose 构建的 API 的最佳方法的见解。有 MVC / PHP 背景后,有趣的是发现 Node 应用程序没有字符串/定义的结构。

到目前为止,我的 app.js 文件可以自动加载我的 routes.js 文件、所有模型 js 文件等。

困惑主要在于我的路线应该如何与来自 Mongo 的数据进行交互。这是我的代码布局的基本概要。

app.js

/**
 * Require Dependencies
 */
var restify    = require('restify')
    , mongoose = require('mongoose')
    , config   = require('./config')
    , routes   = require('./routes');

/**
 * Create Server & Define Settings
 */
var server = restify.createServer({
    name: config.name,
    version: config.version
});

/**
 * Common Handlers
 */
server.use(restify.acceptParser(server.acceptable));
server.use(restify.queryParser());
server.use(restify.bodyParser());
server.use(restify.jsonp());

/**
 * Connect to Mongo Database
 */
 mongoose.connect(config.mongo.uri, function(err) {

    // assign connection to var so we can pass it down the chain
    var db = mongoose.connection;

    // handle connection error
    db.on('error', console.error.bind(console, 'connection error:'));

    // handle connection success
    db.once('open', function callback () {

        /**
         * Start Routing API Calls
         */
        routes.route(server, db);

    });

});

/**
 * Start Server & Bind to Port
 */
server.listen(config.port, function () {
    console.log('%s v%s listening on port %s in %s mode.', server.name, server.version,          config.port, config.env);
});

routes.js

module.exports.route = function(server, db) {

    var Users = require('./models/users.js');

    /**
     * Users
     */

    server.get('/users', function (req, res, next) {

        res.send(Users.list(db, req, res));

        return next();

    });

    server.get('/users/:user_id', function (req, res, next) {

        res.send(Users.get(db, req, res));

        return next();

    });

}  

models/users.js

// fake database
var users = [
    {
        name: 'Nick P',
        email: 'nick@domain.com'
    },
    {
        name: 'Zack S',
        email: 'zack@domain.com'
    }
];

exports.list = function(db, req, res) {

return users;

};

exports.get = function(db, req, res) {

    return users[req.params.user_id];

};

如您所见,我使用的是一个“假数据库”,它是一个简单的对象。我在哪里/如何引入 Mongoose 层来与我们的数据库通信?我最关心的是我应该如何使用schemas 和导出。任何代码示例或方向都会很棒。

【问题讨论】:

  • 只需让Users.list 使用猫鼬访问数据库,而不是仅仅返回假数据库。也许我不明白这个问题。
  • @Chad 我想就这么简单。但是,我也是 Mongoose 的新手,看起来他们需要模式定义。对于我应该把那些 [Mongoose Schemas] mongoosejs.com/docs/guide.html
  • 无论你想要什么,我通常都会将它们作为模型的一部分。

标签: javascript node.js mongodb mongoose restify


【解决方案1】:

这里有一个简单的例子,说明我通常用Express 做的事情,这和Restify 是一样的。您可以以相同的方式管理您的 Mongoose 架构,但在您的 Restify 路由中。

app.js

var express = require('express');     
var app = express();

app.configure(function () {
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
});

// connection to mongoDB
var mongoose = require('mongoose');
mongoose.connect('mongodb:mongoURI');    

var user = require('./routes/users');

app.get('/users/list', user.list);

app.listen(3000);

models/user.js

var mongoose = require('mongoose')
   ,Schema = mongoose.Schema
   ,ObjectId = Schema.ObjectId;

var userSchema = new Schema({
    id: ObjectId,
    name: {type: String, default: ''},
    email: {type: String, default: ''}
});

module.exports = mongoose.model('User', userSchema);

routes/users.js

var User = require('../models/user.js');

exports.list = function(req, res) {
    User.find(function(err, users) {
        res.send(users);
    });
};

【讨论】:

  • 所以你的模型只包含模式定义?你的路由处理所有的数据库交互?我想在模型/路线方面我有点困惑。在 PHP 中,控制器和路由可以互换使用(它们调用您的模型),您的模型负责处理任何数据/操作。
  • 这取决于我需要做什么样的操作,我认为我的路由就像 PHP 中的控制器。当我进行一些繁重的数据操作时,我更喜欢在服务中的路由之外进行操作,比如 service/user.js 并在我的路由中使用该服务。所有这些逻辑都可以在模型中,但我更喜欢只使用我的模式来保持它的整洁,并像实体一样使用它。我想这是我的偏好。
  • 在处理数据时有两种广泛使用的模式——ActiveRecord 和 Repository。在第一个中,对数据的所有操作都是持久对象本身的方法。在第二种情况下,所有操作都是存储库对象的成员,并且您将持久对象作为参数传递。 @NickParsons 也许这就是您感到困惑的原因。模型本身可能驻留在一个单独的文件中,但您对它执行的操作(删除、创建、更新)可能位于控制器(或路由)中。
  • @JpBond 你还应该在 app.js 中添加一个var mongoose = require('mongoose')
  • 这有助于澄清一些@Slavo。你对使用路由而不是控制器有什么特别的偏好吗?这是另一个我还不太确定的约定。它们似乎可以互换使用。
猜你喜欢
  • 2019-12-24
  • 1970-01-01
  • 2017-06-04
  • 1970-01-01
  • 2014-01-31
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多