0

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

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

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

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

  • 文章

    { id: 12, title: '我的精彩文章*我说过而且我知道', content: 'blah blah blah blah', 标签: [{tagObject}, {tagObject}, {tagObject}] }

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

我的问题:

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

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

    • 端点将调用对象模板;
    • 对象模板将从数据库中获取数据;
    • 当从其他端点调用时,端点将返回对象模板;
    • Endpoint 将调用模板引擎将对象模板解析为 api 用户的 JSON 字符串。将为每个端点提供 JSON 字符串视图。
  3. 什么模板引擎可以在对象模板下处理并将它们视为变量,在 PHP 中我使用 Twig 可以接收 PHP 对象并将它们视为变量。在这里你可以找到我是如何使用 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);
    }
  }
}

希望有人能给我指路。

4

1 回答 1

2

我使用 express 来做我的 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 }
});
于 2012-10-05T07:29:21.660 回答