Rest API Node Js & Express,创建链接(href)到自己

Posted

技术标签:

【中文标题】Rest API Node Js & Express,创建链接(href)到自己【英文标题】:Rest API Node Js & Express, create link(href) to self 【发布时间】:2018-05-13 13:26:41 【问题描述】:

目前我正在 Node JS & Express 中开发一个 REST API。我必须为 API 中的每个资源创建一个链接,如下例所示。

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

我知道我可以在我的控制器中处理这个问题,因为 req 对象是可用的。但最好在我的模型中创建一个虚拟字段来动态创建链接,而不是将其保存在数据库中。

最好的方法是什么?

数据库: MongoDB ODM:猫鼬

【问题讨论】:

【参考方案1】:

有很多方法可以做到这一点,您没有描述您的 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)
     ;
  
);

鉴于此,这两个链接计算器可以使用一些标准模式或正则表达式来确定链接的一般外观。

或者,如果您使用的是 Mongoose,您可以覆盖 toJSON 以填充您希望通过网络发送的任何模型中的这些链接,但这意味着您的模型应该知道根应用程序 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 模板可能与模型实际上相关,但在大多数域中并非如此,因此我建议使用中间件方法.

【讨论】:

感谢您的快速回复,我添加了 ODM。有没有办法在我的 Mongoose 模型中使用虚拟字段而不是中间件? 用那个例子更新了。 你是对的,在我的模型中硬编码 URL 是一种不好的做法。谢谢你的协助。我会选择中间件方法。 @MapMyMind 您不一定要对其进行硬编码,您可以通过配置对象注入它或引入环境变量。这将是最好的,无论你在哪里做。我只是说架构根本不是关注 URL 的正确位置。【参考方案2】:

如果您使用的是猫鼬,您可以使用virtual 属性来创建非持久字段,这是一个示例:

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

或者可以在find中间件(post hooks)之后使用,例如:

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

【讨论】:

感谢您的建议。由于我找不到动态创建链接的方法,这似乎不是正确的方法。我觉得硬编码链接不合适。

以上是关于Rest API Node Js & Express,创建链接(href)到自己的主要内容,如果未能解决你的问题,请参考以下文章

nodejs使用Node.js实现REST Client调用REST API

Node.js 通过 REST API 发送图像

Node.js REST API 从 MongoDB 获取数据

使用 node.js 的 Keycloak Rest API

编写 Node.js Rest API 的 10 个最佳实践

如何为 Node JS 设置 REST API