javascript - 如何将上传功能外包为node.js服务

标签 javascript node.js architecture sails.js

我正在尝试将一段上传代码编写为服务,因为我需要在我的软件中实现该功能。我的项目使用 sails.js - 这里是 service 的文档.

在 Controller 中,我得到了这段代码,它上传一个文件,成功后调用函数 saveTheCampaign() 并将文件信息保存在数据库中。

req.file('logo').upload({
         maxBytes: 10000000,
         saveAs: function (uploadFile, cb) {
         cb(null, Date.now() + uploadFile.filename);
         },
         dirname: sails.config.appPath + '/assets/images/campaign/'
         }, function (err, uploadedFiles) {
         if (err) {
         return res.json(500, err);
         }
         else if (uploadedFiles.length === 0) {
         // proceed without files
         res.json({ error: "No image found for upload!"})
         }
         else {
         //  Success: handle uploaded file
         var fileName = uploadedFiles[0].fd.split('\\');
         params["logo"] = fileName[fileName.length - 1];

         sails.controllers.campaign.saveTheCampaign(params, req, res);
         }
 });

 saveTheCampaign: function (params, req, res) { //...}

现在我想将此代码片段编写为服务。我的服务名为 UploadService,有一个名为 upload() 的函数,services可以采用两 (2) 个参数、选项和回调函数。所以我尝试这样调用我的服务的上传功能:

UploadService.upload(options, sails.controllers.campaign.saveTheCampaign(params, req, res));

问题是,回调函数的参数(params、req、res)在调用时未知,我在上传函数完成后获取它们。我该如何处理这个问题?

最佳答案

实现这一目标的一种方法是使用 Q Promise Library 。下面的代码片段是一个相同的工作示例。您需要设置 sails.config.appPath 的值。

Routes.js

'POST /upload' : 'CampaignController.upload'

UploadService.js

let q = require("q"); // https://github.com/kriskowal/q
module.exports = {
  upload: function(options) {
    let deferred = q.defer();
    options['req'].file(options['fileFieldName']).upload({
      maxBytes: 10,
      saveAs: function(uploadedFile, cb) {
        cb(null, Date.now() + uploadedFile.filename);
      },
      dirname: sails.config.appPath + '/assets/images/'
    }, function(err, uploadedFiles) {
      if (err) {
        deferred.reject(err);
      } else if (uploadedFiles.length === 0) {
        // proceed without files
        deferred.reject("No image found for upload!");
      } else {
        //  Success: handle uploaded file
        let params = [];
        var fileName = uploadedFiles[0].fd.split('\\');
        params["logo"] = fileName[fileName.length - 1];
        deferred.resolve(params)
      }
    });
    return deferred.promise;
  }
}

CampaignController.js

module.exports = {
  upload: function(req, res) {
    let options = [];
    options['fileFieldName'] = 'logo';
    options['req'] = req;
    UploadService.upload(options)
      .then((params) => {
        sails.controllers.campaign.saveTheCampaign(params);
        res.send("Campaign Saved Successfully");
      })
      .catch((err) => res.send(err))
  },

  saveTheCampaign: function(params) {
    console.log(`campaign ${params['logo']} saved`);
  }
}

关于javascript - 如何将上传功能外包为node.js服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40562616/

相关文章:

javascript - 理解 module.exports 与回调

javascript - MongoDB 中的文档未删除

node.js - 直接在浏览器中使用 NPM 模块

mysql - 在事务中插入多行,如果其中一行失败,则插入其余行

ios - 模块化 iOS App 的方法有哪些?

ruby-on-rails - 将 Web 服务数据消耗到数据库中?

javascript - 在循环完成nodejs请求之前执行回调

javascript - Fullcalendar 插件悬停时出现 Javascript 错误

javascript - 找不到 create-react-app build service-worker.js 和 manifest.json

json - 如何在 Flux 应用程序中处理嵌套 API 响应?