【问题标题】:How to manage data template when serving an api using Node.js使用 Node.js 提供 api 时如何管理数据模板
【发布时间】:2012-09-26 04:58:06
【问题描述】:

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

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

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

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

  • 文章

    { 编号:12, 标题:'我的精彩文章*我说过,我知道', 内容:'废话废话', 标签:[{tagObject}, {tagObject}, {tagObject}] }

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

我的问题:

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

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

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

对象模板文件内容示例:

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);
    }
  }
}

希望有人能给我指路。

【问题讨论】:

    标签: api node.js architecture


    【解决方案1】:

    我使用 express 来做我的 api...你可以这样做:

    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 }
    });
    

    【讨论】:

    • 您的解决方案很棒,但我无法实现,因为我没有使用 mongoose 和 mongodb,我使用的是关系非常复杂的 MySQL。虽然我意识到我当前的表结构无法实现我想要在我的问题中描述的内容,因为应该实现太多的查询回调来获取所有必需的数据。顺便说一句
    • 你有模型文件吗?您可以通过回调一个一个地加载每个模型,然后在最后一个回调到res.json(all_data)
    • 是的,我拥有它们,而且我正在这样做,但是将来要维护哪些数据以及数据应该如何呈现给 api 用户将非常烦人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 2016-09-20
    • 1970-01-01
    • 2016-04-15
    • 2016-10-22
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多