格式化/自定义远程响应的最佳方法是什么?

时间:2015-09-28 03:17:29

标签: loopbackjs

有时,我们需要在将响应JSON数据发送到客户端之前对其进行修改。例如:

//model definition
{
  "name": "File",
  "base": "PersistedModel",
  "properties": {
    "filename": {
      "type": "string",
      "required": true
    },
    "filepath": {
      "type": "string"
    }
  }
  "protected": ["filepath"]
}

我希望在GET url请求中获得/files/:id属性,因此我在原型上定义了一个url GETTER。

//file.js

module.exports = function(File){
  var baseUrl = 'http://example.com/uploads/files/';
  File.prototype.__defineGetter__('url', function(){
    return baseUrl + this.id.toString() + this.filename;
  });
}

我的问题是如何在我提出请求时将url属性公开给远程响应?

GET /files/123456

期待回复如下:

{
  id: '123456',
  filename: 'myfile.ext',
  url: 'http://example.com/uploads/files/123456/myfile.ext'
}

非常感谢!

2 个答案:

答案 0 :(得分:2)

使用远程方法/挂钩并相应地自定义您的响应。请参阅https://github.com/strongloop/loopback-example-app-logic/blob/master/common/models/car.js

答案 1 :(得分:1)

您可以使用Operation Hooks来拦截CRUD操作,而不依赖于调用它们的特定方法。

下面的代码将在加载File对象时将url属性添加到File对象。

File.observe('loaded', function(ctx, next) {
  var baseUrl = 'http://example.com/uploads/files/';
  ctx.data.url = baseUrl + data.id + data.filename;

  next();
});

当调用以下任何方法时,无论是直接在JS中还是通过HTTP API间接调用,都会调用此方法。

  • 找到()
  • findOne()
  • findById()
  • 存在()
  • 计数()
  • 创建()
  • upsert()(与updateOrCreate()相同)
  • findOrCreate()
  • prototype.save()
  • prototype.updateAttributes()

其他操作挂钩包括:

  • 访问
  • 保存前
  • 保存后
  • 删除前
  • 删除后
  • 装载
  • 坚持