loopback - 从其他模型上传文件

时间:2016-10-06 06:57:12

标签: node.js api storage loopbackjs

我有两种模式:

容器: 处理文件上传,并在loopback explorer中正常工作。

履带: 有多个属性。其中一个属性是script,用户可以将脚本文件上传到此模型。

crawler.json

{
  "name": "Crawler",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "name": {
      "type": "string",
      "required": true
    },
    "script": {
      "type": "string"
    },
    "startCount": {
      "type": "number",
      "default": 0
    },
    "created_at": {
      "type": "date"
    },
    "updated_at": {
      "type": "date"
    }
  },
  "validations": [],
  "relations": {},
  "acls": [],
  "methods": {}
}

crawler.js

module.exports = function(Crawler) {
  Crawler.upload = function (id,req,res,cb) {
    var container = Crawler.app.models.container;
    container.getContainers(function(er,containers){
      console.log(containers);
      if (containers.some(function(e){return e.name == 'script';})) {
        container.upload(req,res,{container:"script"},cb);
      }else{
        container.createContainer({name: "script"}, function(er,c){
          container.upload(req,res,{container: "script"},cb);
        });
      }
    });
  Crawler.remoteMethod(
    'upload',
    {
      description: 'Uploads a script',
      accepts: [
        { arg: 'id', type: 'string', http: {source: 'path'}},
        { arg: 'req', type: 'object', http: { source:'req' } },
        { arg: 'res', type: 'object', http:{ source: 'res'} }
      ],
      returns: {
        arg: 'crawler', type: 'Crawler', root: true
      },
      http: {path: '/:id/script',verb: 'post'}
    }
  );
};

问题是我运行POST /Crawlers/:id/script时,程序冻结container.upload(...)函数并且不返回任何内容。过了一会儿,请求将因超时而中止。

我在StackOverflow上找到this solution,但同样的问题也在那里发生。

upload功能会怎样?传递给upload的参数是否正确?有没有解决方法?有没有上传loopback-component-storage以外的文件的解决方案?

(我的节点版本是6.7.0和环回2)

1 个答案:

答案 0 :(得分:0)

首先,你应该使用像这样的身体解析器中间件:

"parse": {
    "body-parser#json": {},
    "body-parser#urlencoded": {"params": { "extended": true }}
}

BTW文件以如下数组发送:fileObject.files[null]