Изменение размера изображения с помощью busboy и Sharp в облачной функции firebase / Nodejs

Возникла проблема при загрузке в облачные функции firebase. Я использую busboy и sharp для достижения этой цели, но каждый раз, когда я запускаю свой код, он возвращает только «завершено со статусом: 'таймаут'» без ошибок ...

этот код будет работать без функции резкого изменения размера, см. ниже код для справки.

const fs = require("fs");
const os = require("os");
const path = require("path");
const Busboy = require("busboy");
const config = require('../config');
const gcs = config.get('gcs');
const UUID = require('uuidv4')
const sharp = require('sharp');


 let insertStorageMaterials = (req,callback) =>{
  const busboy = new Busboy({ headers: req.headers });
  let uploadData = null;
  let origFileName;

  busboy.on("file", (fieldname, file, filename, encoding, mimetype) => {
    origFileName = filename
    const filepath = path.join(os.tmpdir(), filename);
    uploadData = { file: filepath, type: mimetype };
    file.pipe(fs.createWriteStream(filepath));

  });

  busboy.on("finish", () => {
    const bucket = gcs.bucket(bucketName);
    let uuid = UUID();

    sharp(uploadData.file)
    .resize(500, 500)
    .toFile(uploadData.file)
    .then(data => {
      console.log("data",data)
      bucket
      .upload(uploadData.file, {
        uploadType: "media",
        metadata: {
          metadata: {
            contentType: uploadData.type,
            firebaseStorageDownloadTokens: uuid
          }
        },
        destination:"Materials/test/"+origFileName  
    })
    return data
  }).then(data=>{
      let file = data[0];
      let dataURL = "https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent(file.name) + "?alt=media&token=" + uuid;
      console.log("url",dataURL)
      return callback(false,{dataURL:dataURL,name:origFileName,message:"Success!"});
    .catch(error =>{
      return error;
    })
  })

  busboy.end(req.rawBody);

  }

module.exports = {
  insertStorageMaterials:insertStorageMaterials
}

экспресс-вызов

//index.js
const app = express();
const appUsers = require('./Routes/userRoute')

const api = fbFunc.https.onRequest(app);

app.post(['/uploadMaterials'],appUsers);


module.exports = {api}

//Routes
const userFunc = require('../Functions/userFunc')

apiCalls.post('/uploadMaterials',(req,res)=>{
    userFunc.uploadMaterials(req,(err,result)=>{
      if (err) return res.status(500).send('Internal Server Error')
      return res.status(200).send(result);
  })
})

РЕДАКТИРОВАТЬ:

  sharp(uploadData.file)
    .resize(500, 500)
    .toFile(uploadData.file)
    .then(data => {
      console.log("datadddd",data)
      return bucket
      .upload(uploadData.file, {
        uploadType: "media",
        metadata: {
          metadata: {
            contentType: uploadData.type,
            firebaseStorageDownloadTokens: uuid
          }
        },
        destination:"Materials/test/"+origFileName  
    })

  .then(data=>{
      let file = data[0];
      let dataURL = "https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent(file.name) + "?alt=media&token=" + uuid;
      console.log("url",dataURL)
      return callback(false,{dataURL:dataURL,name:origFileName,message:"Success!"});
    })
    .catch(error =>{
      return error;
    })

}).catch(error =>{
  return error;
})
  })

person Renz M    schedule 17.12.2018    source источник
comment
Где ваше определение функции? Похоже, вы не все показываете.   -  person Doug Stevenson    schedule 17.12.2018
comment
@DougStevenson отредактировал мой ответ, достаточно ли информации? Спасибо!   -  person Renz M    schedule 17.12.2018
comment
На самом деле может потребоваться больше времени. Вы можете увеличить время ожидания / ограничения памяти в консоли.   -  person Phix    schedule 18.12.2018


Ответы (2)


Не уверен, что проблема связана с API изменения размера, но пробовали ли вы использовать метод toBuffer вместо toFile?

sharp(input)
    .resize(500, 500)
    .toBuffer()
    .then(data => {
    // Convert data to image file
    });

Вы можете преобразовать буфер изображения в файл, используя принятый здесь ответ - NodeJS записать файл изображения base64

person Vimal Maheedharan    schedule 17.12.2018

Функции HTTP завершаются, когда вы отправляете ответ обратно клиенту. Поскольку вы никогда не отправляете ответ, функция просто перестанет ждать ответа. Используйте тот res объект, который Express передает вашему коду.

person Doug Stevenson    schedule 17.12.2018
comment
Я отправляю что-то обратно клиенту, просто не включил это раньше, как я сказал, он работает без библиотеки Sharp. - person Renz M; 17.12.2018
comment
Это невозможно сказать, потому что вы все еще не показываете весь код. Вы пропустили его части, и я не могу понять, как все это сочетается друг с другом. - person Doug Stevenson; 17.12.2018
comment
Я сейчас все добавил. - person Renz M; 18.12.2018
comment
Я предполагаю, что вы все еще не возвращаете результат, потому что вы неправильно выполняете обещания. Я не думаю, что ваша линия return data делает то, что вы ожидаете. Тщательно подумайте о том, как данные проходят через вашу функцию, и добавьте журналы отладки повсюду, чтобы видеть, что не вызывается. - person Doug Stevenson; 18.12.2018
comment
Каждый then () должен возвращать значение или выдавать это, показывая, удаляю ли я возвращаемые данные; но я не хочу ничего возвращать, пока загрузка не будет завершена. любое предложение, как мне это сделать? - person Renz M; 18.12.2018
comment
upload () возвращает еще одно обещание, не так ли? - person Doug Stevenson; 18.12.2018
comment
Вы имеете в виду, что я должен вернуть bucket.upload? пожалуйста, посмотрите часть редактирования, если я делаю это правильно .. попробовал, и это не работает .. :( - person Renz M; 18.12.2018
comment
Вы пробовали добавить ведение журнала отладки, чтобы на каждом этапе убедиться, что все значения соответствуют вашим ожиданиям? - person Doug Stevenson; 18.12.2018
comment
Когда я говорю на каждом этапе, я имею в виду, что на протяжении всего кода нужно убедиться, что все значения соответствуют вашим ожиданиям. На самом деле я не могу вместе с вами отлаживать ваш код - вам нужно будет определить конкретную проблему, которую вы не понимаете или не можете отлаживать дальше. - person Doug Stevenson; 18.12.2018