Функция Firebase Cloud для удаления пользователя - PullRequest
0 голосов
/ 20 июня 2020

У нас есть облачная функция в моем индексе. js:

const functions = require('firebase-functions');
const firebase_tools = require('firebase-tools');
const admin = require('firebase-admin');

admin.initializeApp();
 exports.deleteUser = functions.https.onCall((request, response) => { 

   const userId = request.params.userId;

   console.log('deleting user: ' + userId + ' ...');

   return firebase_tools.firestore
      .delete('messages/' + userId, {
        project: process.env.GCLOUD_PROJECT,
        recursive: true,
        yes: true,
        token: functions.config().fb.token
      }).then(  () => {
        return 'success';
      }
    ).catch( (error) => {
      console.log('Error deleting user messages: ', error);
    });
 });

В моем быстром коде я вызываю это так в моей функции удаления:

func deleteUser() {
        
        let userId = Auth.auth().currentUser!.uid
        
        let url = URL(string: "https://us-central1-myapp.cloudfunctions.net/deleteUser?userId=\(userId)")!
        URLSession.shared.dataTask(with: url) { (data: Data?, response: URLResponse?, error: Error?) in
            if let data = data, let string = String(data: data, encoding: .utf8) {
                print("Delete user response:\n \(string)")
            } else {
                print("Deleting user failed:\n \(error?.localizedDescription ?? "N/A")")
            }
        }.resume()
        
    }

При выполнении Я получаю следующие ошибки:

Request has invalid method. GET

И я получаю следующее сообщение сразу после указанной выше ошибки

Invalid request IncomingMessage {
  _readableState: 
   ReadableState {
     objectMode: false,
     highWaterMark: 16384,
     buffer: BufferList { head: null, tail: null, length: 0 },
     length: 0,
     pipes: null,
     pipesCount: 0,
     flowing: null,
     ended: true,
     endEmitted: false,
     reading: false,
     sync: true,
     needReadable: false,
     emittedReadable: true,
     readableListening: false,
     resumeScheduled: false,
     destroyed: false,
     defaultEncoding: 'utf8',
     awaitDrain: 0,
     readingMore: true,
     decoder: null,
     encoding: null },
  readable: true,
  domain: null,
  _events: { end: [Function: resetHeadersTimeoutOnReqEnd] },
  _eventsCount: 1,
  _maxListeners: undefined,
  socket: 
   Socket {
     connecting: false,
     _hadError: false,
     _handle: 
      TCP {
        reading: true,
        owner: [Circular],
        onread: [Function: onread],
        onconnection: null,
        writeQueueSize: 0,
        _consumed: true },
     _parent: null,
     _host: null,
     _readableState: 
      ReadableState {
        objectMode: false,
        highWaterMark: 16384,
        buffer: [Object],
        length: 0,
        pipes: null,
        pipesCount: 0,
        flowing: true,
        ended: false,
        endEmitted: false,
        reading: true,
        sync: false,
        needReadable: true,
        emittedReadable: false,
        readableListening: false,
        resumeScheduled: false,
        destroyed: false,
        defaultEncoding: 'utf8',
        awaitDrain: 0,
        readingMore: false,
        decoder: null,
        encoding: null },
     readable: true,
     domain: null,
     _events: 
      { end: [Array],
        _socketEnd: [Function: onSocketEnd],
        drain: [Array],
        timeout: [Function: socketOnTimeout],
        data: [Function: bound socketOnData],
        error: [Array],
        close: [Array],
        resume: [Function: onSocketResume],
        pause: [Function: onSocketPause] },
     _eventsCount: 9,
     _maxListeners: undefined,
     _writableState: 
      WritableState {
        objectMode: false,
        highWaterMark: 16384,
        finalCalled: false,
        needDrain: false,
        ending: false,
        ended: false,
        finished: false,
        destroyed: false,
        decodeStrings: false,
        defaultEncoding: 'utf8',
        length: 0,
        writing: false,
        corked: 0,
        sync: true,
        bufferProcessing: false,
        onwrite: [Function: bound onwrite],
        writecb: null,
        writelen: 0,
        bufferedRequest: null,
        lastBufferedRequest: null,
        pendingcb: 0,
        prefinished: false,
        errorEmitted: false,
        bufferedRequestCount: 0,
        corkedRequestsFree: [Object] },
     writable: true,
     allowHalfOpen: true,
     _bytesDispatched: 0,
     _sockname: null,
     _pendingData: null,
     _pendingEncoding: '',
     server: 
      Server {
        domain: null,
        _events: [Object],
        _eventsCount: 2,
        _maxListeners: undefined,
        _connections: 1,
        _handle: [Object],
        _usingSlaves: false,
        _slaves: [],
        _unref: false,
        allowHalfOpen: true,
        pauseOnConnect: false,
        httpAllowHalfOpen: false,
        timeout: 0,
        keepAliveTimeout: 5000,
        _pendingResponseData: 0,
        maxHeadersCount: null,
        headersTimeout: 40000,
        _connectionKey: '6::::8091',
        [Symbol(IncomingMessage)]: [Object],
        [Symbol(ServerResponse)]: [Object],
        [Symbol(asyncId)]: 4 },
     _server: 
      Server {
        domain: null,
        _events: [Object],
        _eventsCount: 2,
        _maxListeners: undefined,
        _connections: 1,
        _handle: [Object],
        _usingSlaves: false,
        _slaves: [],
        _unref: false,
        allowHalfOpen: true,
        pauseOnConnect: false,
        httpAllowHalfOpen: false,
        timeout: 0,
        keepAliveTimeout: 5000,
        _pendingResponseData: 0,
        maxHeadersCount: null,
        headersTimeout: 40000,
        _connectionKey: '6::::8091',
        [Symbol(IncomingMessage)]: [Object],
        [Symbol(ServerResponse)]: [Object],
        [Symbol(asyncId)]: 4 },
     parser: 
      HTTPParser {
        '0': [Function: parserOnHeaders],
        '1': [Function: parserOnHeadersComplete],
        '2': [Function: parserOnBody],
        '3': [Function: parserOnMessageComplete],
        '4': [Function: bound onParserExecute],
        _headers: [],
        _url: '',
        _consumed: true,
        socket: [Circular],
        incoming: [Circular],
        outgoing: null,
        parsingHeadersStart: 0,
        maxHeaderPairs: 2000,
        onIncoming: [Function: bound parserOnIncoming],
        [Symbol(isReused)]: true },
     on: [Function: socketOnWrap],
     _paused: false,
     _httpMessage: 
      ServerResponse {
        domain: null,
        _events: [Object],
        _eventsCount: 2,

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

1 Ответ

3 голосов
/ 20 июня 2020

Вы написали функцию типа вызываемую , но пытаетесь вызвать ее с помощью стандартного HTTP-запроса. Это не сработает. Если вы хотите использовать вызываемый объект на бэкэнде, вам необходимо использовать предоставленную клиентскую библиотеку для его вызова. Примеры см. В документации.

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

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

Опять же, для ясности, вызываемые функции отличаются от HTTP-функций . Обязательно прочтите документацию и выберите тот, который вам нужен.

...