облачная функция считывает файл, но не возвращает содержимое на стороне клиента

#node.js #firebase #google-cloud-functions

# #node.js #firebase #google-облачные функции

Вопрос:

Я использую приведенный ниже код для чтения файла json в хранилище Google firebase, а затем возвращаю содержимое файла. Код работает, но все, что я получаю на стороне клиента, равно null

 exports.updateProductCatalogue = functions.https.onCall(async (data, context) => {
const filepath = data.filepath
const bucketname = data.bucket

const remoteFile = bucket.file("storeid.json");

let buffer = '';
remoteFile.createReadStream()
.on('error', function(err) {console.log(err)})
.on('data', function(response) {
    buffer  = response
    console.log(buffer)

})
.on('end', function() {
    //console.log(buffer);
 console.log("FINISHED!!")
 
})

  return buffer
})
 

это мой вызов js на стороне клиента

 function getUpdatedCatalogue(){
var getStorageData = firebase.functions().httpsCallable('updateProductCatalogue');
var callData = {

"bucket":"test"
}
getStorageData(callData).then(function(result){
console.log(result)

}).catch(function(error){
console.log(error)

})
}
 

Облачная консоль.журнал показывает, что содержимое считывается и отображается в журнале, но на стороне клиента консоль.журнал возвращает значение null. Вот файл, который я читаю.

Почему я не получаю содержимое файла, возвращаемое и отображаемое на стороне клиента? как я могу это исправить?

Ответ №1:

Проблема в том, что вы возвращаете буфер до того, как поток завершит чтение файла.

Попробуйте это (не проверено),

 
exports.updateProductCatalogue = functions.https.onCall(async (data, context) => {
  const filepath = data.filepath;
  const bucketname = data.bucket;

  const remoteFile = bucket.file("storeid.json");

  return new Promise(resolve, reject) => {
    let buffer = '';

    remoteFile.createReadStream()
    .on('error', function(err) {
      console.log(err);
      reject(err);
    })
    .on('data', function(response) {
      buffer  = response;
      console.log(buffer);
    })
    .on('end', function() {
      console.log("FINISHED!!")
      resolve(buffer);
    });
  });
});