Аргумент типа '{действие: строка; истекает: строка; } 'нельзя назначить параметру типа' GetSignedUrlConfig ' - PullRequest
0 голосов
/ 11 января 2020

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

Это мой импорт:

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
import { FieldValue } from "@google-cloud/firestore";
import { _namespaceWithOptions } from "firebase-functions/lib/providers/firestore";
admin.initializeApp(functions.config().firebase);
const db = admin.firestore();
const defaultStorage = admin.storage();

Это в настоящее время моя желаемая облачная функция:

exports.writeFileToDatabase = functions.storage
  .object()
  .onFinalize(object => {
    const bucket = defaultStorage.bucket();
    const file = bucket.file(object.name as string);

    const options = {
        action: 'read',
        expires: '03-17-2025'
      };

    return file.getSignedUrl(options)
    .then(results => {
      const url = results[0];

      console.log(`The signed url is ${url}.`);
      return true;
    })
  });

Но при передаче options в getSignedUrl я получаю эту ошибку:

Argument of type '{ action: string; expires: string; }' is not assignable to parameter of type 'GetSignedUrlConfig'

Также я получаю ошибку при results говоря:

Parameter 'results' implicitly has an 'any' type

Я не вижу, что я делаю иначе, чем примеры, которые я использовал в качестве ссылки.

Ответы [ 2 ]

1 голос
/ 11 января 2020

Итак, то, что решило мою проблему, привело к тому, что объект config был помещен непосредственно в метод следующим образом:

exports.writeFileToDatabase = functions.storage
  .object()
  .onFinalize(object => {
    const bucket = defaultStorage.bucket();
    const file = bucket.file(object.name as string);

    return file.getSignedUrl({
        action: 'read',
        expires: '03-17-2025'
      })
    .then(results => {
      const url = results[0];

      console.log(`The signed url is ${url}.`);
      return true;
    })
  });

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

0 голосов
/ 11 января 2020

Это потому, что вы используете TypeScript и пример, на который вы ссылаетесь, использует JavaScript. Вы должны импортировать тип GetSignedUrlConfig следующим образом:

import { GetSignedUrlConfig } from '@google-cloud/storage';

и сделать

const options: GetSignedUrlConfig = {
  action: 'read',
  expires: '03-17-2025'
};
...