Rest API Node Js & Express, create link(href) to self



当前我正在从事Node JS&表达。我必须为API中的每个资源创建一个链接,如下面的示例。

 {
        "id": "20281",
        "title": "test",
        "body": "test",
        "date": "2017-11-14 09:01:35",
        "_links": {
            "self": {
                "href": "href"
            },
            "collection": {
                "href": "href"
            }
        }
    },

我知道我可以在控制器中处理它,因为REQ对象可用。但是,最好在我的模型中创建一个虚拟字段以即时创建链接,而不是将其保存在DB中。

最好的方法是什么?

db: mongodb ODM: mongoose

有很多方法可以做到这一点,您还没有描述您的DB或ORM或类似的方法,但暗示您与术语相处。

最简单的事情就是假设这不是存储的关注点,而是您要全球应用于API的东西,以便所有路线都应用了。这可能是中间件的形式:

router.use((req, res, next) => {
  if (res.data) { // if you do it this way, none of your routes will actually do a res.send, but instead will put their data into res.data and rely on another middleware to render or send it
     res.data._links = {
       self: calculateSelf(req, res.data),
       collection: calculateCollection(req, res.data)
     };
  }
});

鉴于这两个链接计算器可以使用某些标准模式或正则表达式来弄清楚链接应该一般的外观。

另外,如果您使用的是猫鼬,则可以覆盖托伊森(Tojson)在您期望将电线发送的任何模型中填充这些链接,但这意味着您的模型应该知道root Application url是什么,我不建议。

虚拟字段实现:

YourSchema.virtual('links').get(() => {
  return {
    self: 'http://example.com/api/v1.0/schema/' + this._id,
    collection: 'http://example.com/api/v1.0/schema/'
  };
});

为了使其工作,您必须将{ virtuals: true }传递给toObject()toJSON()或将其设置为全局杂种配置,以始终显示虚拟的。不过,正如我之前所说的,我真的不建议这样做,因为它要求模式可以访问和了解基本URL,这可以在环境之间发生变化。如果(如您的模式所暗示的)模型代表网页,则URL模板可能与模型相关,但是在大多数情况下,情况并非如此,所以我建议您建议使用中间件方法。

如果您使用的是mongoose,可以使用虚拟属性创建一个非持久字段,以下是一个示例:

var MySchema = new Schema({
    id: Number,
    title: String,
    body: String,
    date: Date
});
MySchema.virtual('links').get(function () {
    return {
      self: { 
          href: 'https://docent.cmi.hro.nl/bootb/demo/notes/' + this.id 
      },
      collection: { 
          href: 'https://docent.cmi.hro.nl/bootb/demo/notes' 
      }
    }
});
var My = mongoose.model('My', MySchema);

您可以在查找中间件后使用(挂钩),示例:

var MySchema = new Schema({
    id: Number,
    title: String,
    body: String,
    date: Date
});
MySchema.post('find', function(doc) {
    doc.links = {
        self: {
            'href': 'https://docent.cmi.hro.nl/bootb/demo/notes/' + doc.id 
        },
        collection: {
            'href': 'https://docent.cmi.hro.nl/bootb/demo/notes/'
        }
    }
});
var My = mongoose.model('My', MySchema);

最新更新