如何使用Node.js提供api时管理数据模板

时间:2012-10-05 04:22:07

标签: api node.js architecture

我正在尝试使用Node.js为我的网络应用创建一个api。 api旨在将JSON数据返回给api用户。

例如,我有以下端点/对象:   - 文章(文章集)   - 文章(单篇文章,每篇文章都有标签)   - 标签

每个拥有json数据格式的端点/对象都需要返回,例如:

  • 文章:[{articleObject},{articleObject},{articleObject}]

  • {  id:12,  标题:'我很棒的文章*我说,我知道它',  内容:'blah blah blah blah',  标签:[{tagObject},{tagObject},{tagObject}] }

每个端点都可以调用其他端点来获取所需的数据,例如: 文章端点可以调用Tags端点来获取文章标签集合,Tags端点将返回Array Object。

我的问题:

  1. 如何管理Object结构,所以如果从另一个端点调用的端点将返回Array / Object,而从api用户调用时它将返回JSON字符串。

  2. 我应该为每个端点创建对象模板吗?这个过程将是:

    • 端点将调用对象模板;
    • 对象模板将从数据库中提取数据;
    • 从其他端点调用时,端点将返回对象模板;
    • 端点将调用模板引擎以将对象模板解析为api用户的JSON字符串。将为每个端点提供JSON字符串视图。
  3. 模板引擎可以在对象模板下面处理并将它们视为变量,在PHP中我使用的Twig可以接收PHP对象并将它们视为变量。 Here you can find how i do that using Twig

  4. 对象模板文件内容示例:

    var Tags = require('./tags');
    
    module.exports = function(param){
      /* do fetching data from database for specified parameters */
      /* here */
      var data = {};
    
      return {
        id: function() {
          return data.id;
        },
        title: function() {
          return data.title;
        },
        description: function() {
          return data.description;
        },
        tags: function() {
          return Tags(data.id);
        }
      }
    }
    

    希望有人能告诉我它的方法。

1 个答案:

答案 0 :(得分:2)

我用快递做我的apis ......你可以这样做:

app.get('/api/article', authenticate, routes.api.article.get);

authenticate只是一个中间件功能,可以对用户进行身份验证,通常这会从会话中抓取用户并确保他们已登录。

里面./routes/api.js

var Article = require('../models/article.js');

exports.api = {}
exports.api.article = {}
exports.api.article.get = function(req, res){
 //get article data here
 Article.find({created_by: req.session.user._id}).populate('tags').populate('created_by').exec(function(err, list){
   res.json(list);
 });
};

这假设您正在使用mongoose和mongodb,并且具有与此类似的Article架构,其中包含对Tag架构的引用:

var ArticleSchema = new Schema({
    name    : { type: String, required: true, trim: true }
  , description: { type: String, trim: true }
  , tags  : [{ type: Schema.ObjectId, ref: 'Tag', index: true }]
  , created_by  : { type: Schema.ObjectId, ref: 'User', index: true }
  , created_at    : { type: Date }
  , updated_at    : { type: Date }
});