2016-11-12 28 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

相關問題