如何在strongloop(loopback)框架(REST API)中创建带有图像字段的模型

时间:2016-06-20 12:18:14

标签: node.js rest loopbackjs api-design

以下是带有图像字段的样本模型

MyModel {
  model:string
  color:string
  mymodel_image:string  // <= here the image field 
    //is designed to be string like http://domian.com/api/images/dasfs05fsd44f,png
  ...
  }

我面临的问题是在环回上创建(写入)此模型(带有imagefield)。 这是我到目前为止尝试的两种方法

  1. 首先上传图像并获取图像作为响应然后发布 MyModel imageurl 的数据是两个 http请求。这种方法不适用,因为网络故障(在其中一个请求中)可能导致完整的进程失败。
  2. 另一种方法是使用多部分表单数据的单个http请求是我尝试这样做的 使用 操作挂钩上传图像,然后再保存 ,然后继续创建MyModel

    MyModel.observe('before save',function (ctx, next) {
    //do the file  upload here and get file resource url as a result
    //some thing  like this :
         Container.upload(data,options,function (err,fileObj) {   
                File.create({
                 name: fileInfo.name,
                 type: fileInfo.type,
                 container: fileInfo.container,
                 url: CONTAINERS_URL+fileInfo.container+'/download/'+fileInfo.name
     } ...);
    
       //update tee request body and execute the next  
        //callback(creating MyModel)
        //like: req.body.mymodel_image = imageurl
             next();
    

    });

  3. 这种方法的问题是我无法 访问opration挂钩内的请求对象 (因为ctx参数不包含请求对象)。

    我需要有关整个过程的建议,以及如何使用图像字段解决模型。

    注意:我已经处理了this so question中提到的存储元数据。

1 个答案:

答案 0 :(得分:0)

如何制作远程(自定义)端点,例如POST api/MyModel/upload

有些事情:

MyModel.prototype.upload = function (ctx,options,cb) {
    if(!options) options = {};

    Container.upload(data,options,function (err,fileObj) {   
        File.create({
         name: fileInfo.name,
         type: fileInfo.type,
         container: fileInfo.container,
         url: CONTAINERS_URL+fileInfo.container+'/download/'+fileInfo.name  
      }, function(err, file) {
         //.. Create 
      });

  };

  MyModel.remoteMethod(
      'upload',
      {
          isStatic: false,
          description: 'Uploads a file',
          accepts: [
              { arg: 'ctx', type: 'object', http: { source:'context' } },
              { arg: 'options', type: 'object', http:{ source: 'query'} }
          ],
          returns: {
              arg: 'fileObject', type: 'object', root: true
          },
          http: {path: '/MyModel/upload', verb: 'post'}
      }
    );