我正在尝试将一段上传代码编写为服务,因为我需要在我的软件中实现该功能。我的项目使用 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/