Не удается разрешить обещание getSignedUrl в облачной функции - PullRequest
0 голосов
/ 09 июля 2020

Я пытался отладить функцию Google Cloud, которая должна возвращать signedUrl для загрузки файла в Google Cloud Storage.

У меня есть облачная функция https:

exports.gcpSecureURL = functions.https.onCall((data, res) => {

    const bucketName = data.bucket;
    const fileName = data.filename;

    let signedUrl = generateV4UploadSignedUrl(bucketName, fileName)
        .then(value => {
            console.log("VALUE: ", value);
            return value
        })

    res.send(signedUrl) 
        
});

Value никогда не достигается, а signedUrl всегда является обещанием.

В функции generateV4UploadSignedUrl у меня есть:

async function generateV4UploadSignedUrl(bucketName, fileName) {
    // These options will allow temporary uploading of the file with outgoing
    // Content-Type: application/octet-stream header.
    const options = {
      version: 'v4',
      action: 'write',
      expires: Date.now() + 15 * 60 * 1000, // 15 minutes
      contentType: 'application/octet-stream',
    };
  
    // Get a v4 signed URL for uploading file
    const [url] = await storage
      .bucket(bucketName)
      .file(fileName)
      .getSignedUrl(options)
      
    return url;
  };

Параметр bucketName правильный, а fileName - это просто имя файла, который я хочу загрузить поэтому на этапе, когда я генерирую URL-адрес, не должно иметь значения?

Я не понимаю, почему метод signedUrl () вообще ничего не возвращает. Я изменил разрешение в моем сегменте на StorageAdmin для всех пользователей, и моя функция настроена так, чтобы разрешить неаутентификацию.

В журналах облачных функций в generateV4UploadSignedUrl есть ошибка типа:

TypeError: (intermediate value) is not iterable
at generateV4UploadSignedUrl (/workspace/index.js:51:19)
* 1017 идея, что происходит, и журналы функций кажутся довольно непрозрачными. Что я делаю не так, пожалуйста?

1 Ответ

2 голосов
/ 09 июля 2020

У вас здесь две проблемы.

Во-первых, вы используете функцию вызываемого типа , но похоже, что вы используете ее, как если бы вы пишете HTTP-функцию . Если вы хотите написать вызываемую функцию, обязательно просмотрите соответствующую документацию. Они работают иначе, чем функции HTTP. С вызываемыми функциями вы должны вернуть обещание с данными для отправки вызывающей стороне. С помощью функций HTTP вы вызываете res.send() или эквивалент, чтобы отправить ответ после завершения всей работы asyn c. Убедитесь, что вы понимаете разницу между ними.

Значение никогда не достигается, а signedUrl всегда является обещанием.

signedUrl всегда является обещанием, потому что generateV4UploadSignedUrl равно async, и все функции async всегда возвращают обещание. Вам нужно будет дождаться обещания, чтобы получить разрешенное значение из обещания.

Ваша функция должна использовать async / await и выглядеть примерно так:

exports.gcpSecureURL = functions.https.onCall(async (data, context) => {

    const bucketName = data.bucket;
    const fileName = data.filename;

    let signedUrl = await generateV4UploadSignedUrl(bucketName, fileName)
    console.log("VALUE: ", signedUrl);
    return signedUrl
        
});

Хотя это может не сработать именно то, что вы хотите (убедитесь, что все содержимое signedUrl - это то, что вы хотите отправить клиенту), это должно приблизить вас к тому, что вы хотите.

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