Генерация QR-кодов в режиме без сервера с шаблоном aws - nodejs - PullRequest
0 голосов
/ 02 марта 2020

Мне нужно написать лямбда-функцию и отправить число в поле запроса api, чтобы сгенерировать количество QR-кодов и сохранить их в корзине S3. Я использую серверную среду с шаблоном aws - nodejs , Чтобы кратко описать задачу, скажем, что я получаю число, введенное в запросе API PathParameters, и на основе этого числа мне нужно сгенерировать это количество QR-кодов, используя пакет qr npm, а затем сохранить эти сгенерированные qr в контейнере s3

это то, что я смог сделать до сих пор.

 module.exports.CreateQR = (event,context) =>{
   const numberOfQR = JSON.parse(event.pathParameters.number) ;


    for(let i=0;i<numberOfQR;i++){

     var d= new Date();

     async function createQr(){
      let unique, cipher, raw, qrbase64;
      unique = randomize('0', 16);
      cipher = key.encrypt(unique);
      raw = { 'version': '1.0', data: cipher, type: 'EC_LOAD'}

      // linkArray.forEach( async (element,index) =>{

        let  qrcode = await  qr.toDataURL(JSON.stringify(raw));
        console.log(qrcode);
        // fs.writeFileSync('./qr.html', `<img src="${qrcode}">`)

      const params = {
        Bucket:BUCKET_NAME,
        Key:`QR/${d}/img${i+1}.jpg`,
         Body: qrcode
     };


      s3.upload(params , function(err,data){
       if(err){
          throw err
        }
       console.log(`File uploaded Successfully .${data.Location}`);
      });

      }

    createQr();

   }   





   };

Мне удалось загрузить определенное количество изображений в корзину, но проблема, с которой я сталкиваюсь, заключается в том, что изображения не собираются в порядке. Я думаю, что проблема с асинхронным кодом. Любая идея, как решить эту проблему

1 Ответ

1 голос
/ 04 марта 2020

это потому, что вы не ожидаете загрузки s3, но вместо этого у вас есть обратный вызов. Вы должны использовать .promise из s3 и затем ждать его, так что вы будете ждать загрузки файла, прежде чем переходить к следующему

Я изменил пример кода

См. документы :
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#upload -свойство

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3/ManagedUpload.html#promise -свойство

// see the async keyword before the lambda function
// we need it for use the await keyword and wait for a task to complete before continue
module.exports.CreateQR = async (event,context) =>{
   const numberOfQR = JSON.parse(event.pathParameters.number) ;

   // moved your function out of the loop
   function createQr(){
      // ...
      // here we call .promise and return it so we get a Task back from s3
      return s3.upload(params).promise();
   }

    for(let i=0;i<numberOfQR;i++){
     // ....
     // here we await for the task, so you will get the images being created and uploaded in order
    await createQr();
    }


};

надеюсь, что оно приведет вас к решению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...