2016-11-12 31 views
0

我想写一段我的上传代码作为服务,因为我需要在我的软件中的整体功能。我的项目使用sails.js - 这里的文档为service如何外包作为服务的上传功能notde.js

在控制器中,我得到了这个代码,它上传了一个文件,成功之后它调用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可以带两个参数,一个选项和一个回调函数。所以,我想这个打电话给我服务的上传功能:

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

的问题是,回调函数的PARAMS(参数,可以REQ,RES)在调用的时候是不知道,我让他们上传功能完成后。我该如何处理?

回答

1

通过使用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`); 
    } 
} 
+0

谢谢你,它的工作现在对我来说有些变化之后。普通的Promise和这个Q库有什么区别? https://jsfiddle.net/ah3322/396o81xb/ – Suisse