Невозможно вернуть строку URL-адреса, хотя и способен console.log. Не уверен почему - PullRequest
0 голосов
/ 21 мая 2019

Я пишу лямбда-функцию, где я сохраняю файл в s3 с помощью s3.upload, затем пытаюсь получить заранее заданный URL-адрес s3.getSignedUrl, чтобы внешний пользователь мог загрузить загруженный мной файл.

Теперь, когда я помещаю console.log для регистрации URL-адреса, URL-адрес регистрируется в cloudwatch, однако, когда я пытаюсь вернуть то же самое в следующей строке, он не работает.

 s3.getSignedUrl('getObject', {
                    Bucket: '<Bucket-Name>',
                    Key: '<Key>',
                    Expires: signedUrlExpireSeconds
                }, function(err, url){
                    if(err) throw err;
                    console.log(url);
                    return { ...response, body: JSON.stringify({message: url}) };            
                })
            });
        });

        return { ...response, body: JSON.stringify({message: 'outsideresult'}) };

Это часть кода, строка console.log может регистрировать url, однако url не возвращается.

И выполняется внешний оператор возврата.

URL работает так, как и положено.Пожалуйста, проверьте, может ли кто-нибудь помочь мне с этим.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Это потому, что этот код выполняется асинхронно. Функция, которую вы передаете как callback function(err, url), вызывается, когда операция завершается успешно. Если вы возвращаете что-то в функцию обратного вызова, она не возвращает исходную область действия

s3.getSignedUrl метод не возвращает значение, которое вы передаете из обратного вызова

Если вы выполните приведенный ниже код с console.logs, вы увидите, что сначала возвращается функция main, а затем обратный вызов, тогда как должно быть наоборот Вот как работает JavaScript

 s3.getSignedUrl('getObject', {
                    Bucket: '<Bucket-Name>',
                    Key: '<Key>',
                    Expires: signedUrlExpireSeconds
                }, function(err, url){
                    if(err) throw err;
                    console.log(url);
                    //This is executed later. Returning something here has no effect
                    console.log("Callback returns")
                    return { ...response, body: JSON.stringify({message: url}) };            
                })
            });
        });
console.log("Main Function returns")
        return { ...response, body: JSON.stringify({message: 'outsideresult'}) };
0 голосов
/ 21 мая 2019

Поскольку последний оператор, т. Е.

return { ...response, body: JSON.stringify({message: 'outsideresult'}) };

, выполнен перед обратным вызовом.

`function(err, url){ 
      if(err) throw err;
      console.log(url);
      return { ...response, body: JSON.stringify({message: url}) }; 
     })`

, поэтому, когда этот обратный вызов выполняется, он регистрирует только оператор на консоли.поэтому сделайте некоторые обновления в вашей логике.

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