ファイルをGoogleクラウドにアップロードしてからパブリックURLを取得するには、次のコードを使用しました。しかし、約束事をつなぎ合わせると、すぐに乱雑になります。ES6クラスを使用しているときの約束
私の例では、約束事をより明確な方法で連鎖させる具体的な例を手伝ってもらえますか?
let routes = function(imageUploader) {
router.post('/upload',
imageUploader.getMulter().single('image'),
(req, res) => {
imageUploader.uploadFilePromise(req.file.path)
.then((filename, error) => {
if(error) throw new Error(error);
imageUploader.getExternalUrl(filename)
.then((publicUrl, error) => {
if(error) throw new Error(error);
console.log(publicUrl);
})
})
});
return router;
};
私のImageUploaderクラスはFYI同様にここに含まれています。他のベストプラクティスの提案も大歓迎です。
const Multer = require('multer'), gcloudStorage = require('./vendors/gcloud');
class ImageUploader {
constructor() {
this.bucket = gcloudStorage;
}
uploadFile(req, res, next) {
if(!req.file) {
next();
}
this.bucket.upload(req.file.path, (err, file) => {
if(err) throw new Error(err);
req.file.publicUrl = this.getExternalUrl(req.file.name)
})
}
uploadFilePromise(path) {
return new Promise((resolve, reject) => {
this.bucket.upload(path, (err, file) => {
if(err) reject(err);
resolve(file.name);
})
})
}
getExternalUrl(filename) {
return new Promise((resolve, reject) => {
this.bucket.file(filename).getSignedUrl({
action: 'read',
expires: '03-17-2025'
}, (err, url) => {
if (err) reject(err);
resolve(url);
});
});
}
storage() {
return Multer.diskStorage({
destination: function (req, file, cb) {
cb(null, 'uploads/')
},
filename: function (req, file, cb) {
cb(null, Date.now() + file.originalname)
}
});
}
getMulter() {
return require('multer')({ storage: this.storage() });
}
}
module.exports = ImageUploader;
わからない本当にES6固有のこの問題については何ですか?はい、あなたは 'class'定義を表示していますが、私はES6構文で宣言されたオブジェクトやオブジェクトを作成する古いES5の方法とは異なる疑問があります。 – jfriend00