хорошо, вот оно:
app.post('/upload', upload.single('songFile'), (req, res) => {
cloud_bucket.upload(req, res, console.log, res.send('1'));
});
рассматриваемая функция: res.send ('1');
здесь это cloud_bucket.upload:
module.exports = {
upload: function (req, res, next, fin) {
fileToBucket(req, res, next, fin);
}
}
//send file to cloud bucket
fileToBucket = (req, res, next, fin) => {
const file = req.file;
var url = '';
const gcsname = uuidv4() + file.originalname;
file2 = myBucket.file(gcsname);
const stream = file2.createWriteStream({metadata: {contentType: file.mimetype}});
stream.on('error', (err) => {
file.cloudStorageError = err;
next(err);
});
stream.on('finish', () => {
file.cloudStorageObject = gcsname;
file2.makePublic().then(() => {
file.cloudStoragePublicUrl = getPublicUrl(gcsname);
url = file.cloudStoragePublicUrl;
return url;
}).then((url) => {
console.log('upload complete');
metaToDb(req, url, res);
});
});
stream.end(file.buffer);
}
//send metadata to mysql
metaToDb = (req, url, res) => {
Song.create({
title: req.body.title,
description: req.body.description,
genres: req.body.genres,
owner: req.session.user.idUsers,
dateUploaded: new Date(),
URL: url
})
}
Как видите, я не вызываю fin () в любом месте функции.но все же res.send ('1') вызывается, если я не уберу его из начального вызова функции.
кажется, что он вызывается автоматически, когда fileToBucket завершается (не асинхронные вызовы), но я бынравится называть это в одном из обещаний.