Firebase-tools: рд╕реЗрдЯрдЕрдк:рд╡реЗрдм INVALID_ARGUMENT рд╕реНрдерд┐рддрд┐ рдХреЛрдб 400

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдирд╡ре░ 2018  ┬╖  41рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: firebase/firebase-tools

рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдирдХрд╛рд░реА: 6.1.0
рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЬрд╛рдирдХрд╛рд░реА: OSX

рдкреНрд░рдЬрдирди рдХреЗ рдЪрд░рдг

рд╕реАрдбреА рдбреАрдЖрдИрдЖрд░
рдлрд╛рдпрд░рдмреЗрд╕ init (рдХреЗрд╡рд▓ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ)
рдореМрдЬреВрджрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ
рдлрд╛рдпрд░рдмреЗрд╕ рд╕рд░реНрд╡ - рдХреЗрд╡рд▓ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ --debug

рдпрд╣ рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рд╕рд╛рдЗрдЯ рдЪрд▓рд╛рддрд╛ рд╣реИред

[2018-11-15рдЯреА17:12:15.331рдЬреЗрдб] <<< рдПрдЪрдЯреАрдЯреАрдкреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 400 рднрд┐рдиреНрди = рдПрдХреНрд╕-рдЙрддреНрдкрддреНрддрд┐, рд╕рдВрджрд░реНрднрдХрд░реНрддрд╛, рдЙрддреНрдкрддреНрддрд┐, рд╕реНрд╡реАрдХреГрддрд┐-рдПрдиреНрдХреЛрдбрд┐рдВрдЧ, рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ = рдЖрд╡реЗрджрди/рдЬреЗрд╕рди; рд╡рд░реНрдгрд╕реЗрдЯ = рдпреВрдЯреАрдПрдл -8, рджрд┐рдирд╛рдВрдХ = рдЧреБрд░реБ, 15 рдирд╡рдВрдмрд░ 2018 17:12:15 рдЬреАрдПрдордЯреА, рд╕рд░реНрд╡рд░ = рдИрдПрд╕рдПрдл, рдХреИрд╢-рдХрдВрдЯреНрд░реЛрд▓ = рдирд┐рдЬреА, x-xss-рд╕реБрд░рдХреНрд╖рд╛ = 1; рдореЛрдб = рдмреНрд▓реЙрдХ, x-рдлреНрд░реЗрдо-рд╡рд┐рдХрд▓реНрдк = SAMEORIGIN, x-рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░-рд╡рд┐рдХрд▓реНрдк = nosniff, alt-svc=quic=":443"; рдорд╛ = 2592000; v="44,43,39,35", рдПрдХреНрд╕реЗрдкреНрдЯ-рд░реЗрдВрдЬ=рдХреЛрдИ рдирд╣реАрдВ, рдХрдиреЗрдХреНрд╢рди=рдХрд░реАрдм
[2018-11-15T17:12:15.331Z] <<< HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмреЙрдбреА рдХреЛрдб = 400, рд╕рдВрджреЗрд╢ = рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдХ рдЕрдорд╛рдиреНрдп рддрд░реНрдХ рд╣реИред рд╕реНрдерд┐рддрд┐ = INVALID_ARGUMENT

рддреНрд░реБрдЯрд┐: HTTP рддреНрд░реБрдЯрд┐: 400, рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдХ рдЕрдорд╛рдиреНрдп рддрд░реНрдХ рд╣реИред
[2018-11-15T17:12:15.532Z] рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рдВрдЧ: {
"рддрди": {
"рддреНрд░реБрдЯрд┐": {
"рдХреЛрдб": 400,
"message": "рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдХ рдЕрдорд╛рдиреНрдп рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИред",
"рд╕реНрдерд┐рддрд┐": "INVALID_ARGUMENT"
}
},
"рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛": {
"рд╕реНрдЯреЗрдЯрд╕ рдХреЛрдб": 400,
"рддрди": {
"рддреНрд░реБрдЯрд┐": {
"рдХреЛрдб": 400,
"message": "рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдХ рдЕрдорд╛рдиреНрдп рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИред",
"рд╕реНрдерд┐рддрд┐": "INVALID_ARGUMENT"
}
},
"рд╣реЗрдбрд░": {
"рднрд┐рдиреНрди": "рдПрдХреНрд╕-рдУрд░рд┐рдЬрд┐рди, рд░реЗрдлрд░рд░, рдУрд░рд┐рдЬрд┐рди, рдПрдХреНрд╕реЗрдкреНрдЯ-рдПрдиреНрдХреЛрдбрд┐рдВрдЧ",
"рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░": "рдПрдкреНрд▓рд┐рдХреЗрд╢рди/рдЬреЗрд╕рди; рд╡рд░реНрдгрд╕реЗрдЯ = рдпреВрдЯреАрдПрдл -8",
"рддрд╛рд░реАрдЦ": "рдЧреБрд░реБ, 15 рдирд╡рдВрдмрд░ 2018 17:12:15 рдЬреАрдПрдордЯреА",
"рд╕рд░реНрд╡рд░": "рдИрдПрд╕рдПрдл",
"рдХреИрд╢-рдХрдВрдЯреНрд░реЛрд▓": "рдирд┐рдЬреА",
"x-xss-рд╕реБрд░рдХреНрд╖рд╛": "1; рдореЛрдб = рдмреНрд▓реЙрдХ",
"x-рдлреНрд░реЗрдо-рд╡рд┐рдХрд▓реНрдк": "SAMEORIGIN",
"x-рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░-рд╡рд┐рдХрд▓реНрдк": "nosniff",
"alt-svc": "quic=\":443\"; ma=2592000; v=\"44,43,39,35\"",
"рд╕реНрд╡реАрдХрд╛рд░-рд╕реАрдорд╛": "рдХреЛрдИ рдирд╣реАрдВ",
"рдХрдиреЗрдХреНрд╢рди": "рдХрд░реАрдм"
},
"рдкреНрд░рд╛рд░реНрдердирд╛": {
"рдЙрд░реА": {
"рдкреНрд░реЛрдЯреЛрдХреЙрд▓": "https:",
"рд╕реНрд▓реИрд╢": рд╕рдЪ,
"рдкреНрд░рдорд╛рдг": рд╢реВрдиреНрдп,
"рд╣реЛрд╕реНрдЯ": "mobilesdk-pa.googleapis.com",
"рдкреЛрд░реНрдЯ": 443,
"рд╣реЛрд╕реНрдЯрдирд╛рдо": "mobilesdk-pa.googleapis.com",
"рд╣реИрд╢": рд╢реВрдиреНрдп,
"рдЦреЛрдЬ": рд╢реВрдиреНрдп,
"рдХреНрд╡реЗрд░реА": рд╢реВрдиреНрдп,
"рдкрдердирд╛рдо": "/ v1/рдкреНрд░реЛрдЬреЗрдХреНрдЯ/540833485883/рдХреНрд▓рд╛рдЗрдВрдЯ/_: getWebAppConfig",
"рдкрде": "/ v1/рдкреНрд░реЛрдЬреЗрдХреНрдЯ/540833485883/рдХреНрд▓рд╛рдЗрдВрдЯ/_: getWebAppConfig",
"href": " https://mobilesdk-pa.googleapis.com/v1/projects/540833485883/clients/_ :getWebAppConfig"
},
"рд╡рд┐рдзрд┐": "рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ"
}
}
}

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдзреНрдпрд╛рди рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред рд╣рдо рдЕрднреА рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╕рдХреНрд░рд┐рдпрддрд╛ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

(рдЖрдВрддрд░рд┐рдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдВрдЦреНрдпрд╛: 119615185)

рд╕рднреА 41 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореЗрд░рд╛ рднреА рдпрд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИ:

рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рдирдХрд╛рд░реА: 6.1.0 (6.0.0, 5.0.0 рдХреЗ рд╕рд╛рде рднреА рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛)
рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЬрд╛рдирдХрд╛рд░реА: OSX 10.14 macOS Mojave 18A391

$ firebase serve --only hosting,functions --debug

рдореМрдЬреВрджрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдФрд░ рдПрдХ рдирдП рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ред рд╡рд╣реА рддреНрд░реБрдЯрд┐ред

Error: HTTP Error: 400, Request contains an invalid argument.
[2018-11-15T17:40:46.943Z] Error Context: {
  "body": {
    "error": {
      "code": 400,
      "message": "Request contains an invalid argument.",
      "status": "INVALID_ARGUMENT"
    }
  },
  "response": {
    "statusCode": 400,
    "body": {
      "error": {
        "code": 400,
        "message": "Request contains an invalid argument.",
        "status": "INVALID_ARGUMENT"
      }
    },
    "headers": {
      "vary": "X-Origin, Referer, Origin,Accept-Encoding",
      "content-type": "application/json; charset=UTF-8",
      "date": "Thu, 15 Nov 2018 17:40:46 GMT",
      "server": "ESF",
      "cache-control": "private",
      "x-xss-protection": "1; mode=block",
      "x-frame-options": "SAMEORIGIN",
      "x-content-type-options": "nosniff",
      "alt-svc": "quic=\":443\"; ma=2592000; v=\"44,43,39,35\"",
      "accept-ranges": "none",
      "connection": "close"
    },
    "request": {
      "uri": {
        "protocol": "https:",
        "slashes": true,
        "auth": null,
        "host": "mobilesdk-pa.googleapis.com",
        "port": 443,
        "hostname": "mobilesdk-pa.googleapis.com",
        "hash": null,
        "search": null,
        "query": null,
        "pathname": "/v1/projects/128559963708/clients/_:getWebAppConfig",
        "path": "/v1/projects/128559963708/clients/_:getWebAppConfig",
        "href": "https://mobilesdk-pa.googleapis.com/v1/projects/128559963708/clients/_:getWebAppConfig"
      },
      "method": "GET"
    }
  }
}

рдореБрдЭреЗ рдареАрдХ рд╡реИрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИред рдореИрдВрдиреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╢реАрди рдкрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдХреЗ рдЙрд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдПрдХ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬреЛ рд▓рдЧрднрдЧ 3 рдорд╣реАрдиреЗ рдареАрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╡рд╣реА рд╣реИред рдЕрдкрдиреЗ рд╕рд╛рдорд╛рдиреНрдп, рд▓реЗрдХрд┐рди рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдХреЛ рддреИрдирд╛рдд рдХрд░рдирд╛ (_firebase рд╕рд░реНрд╡ - рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди, рд╣реЛрд╕реНрдЯрд┐рдВрдЧ --debug_) рдмрд╕ рдЗрд╕ рдПрдиреЛрдЗрдВрдЧ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдВ ...
рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдРрдк (рдореЗрд░реА рдпрд╛ рдЖрдкрдХреА) рд╣реИред
рд▓рдЧрднрдЧ 2 рдШрдВрдЯреЗ рдкрд╣рд▓реЗ рд╕рдм рдХреБрдЫ рдареАрдХ рдЪрд▓ рд░рд╣рд╛ рдерд╛!

рдореЗрд░реЗ рд▓рд┐рдП +1

рд╡рд╣реА рдореБрджреНрджрд╛ред рдХрд▓ рд╕рдм рдХреБрдЫ рдареАрдХ рд░рд╣рд╛

[2018-11-15T17:22:20.885Z] >>> HTTP REQUEST GET https://mobilesdk-pa.googleapis.com/v1/projects/xxx/clients/_:getWebAppConfig

[2018-11-15T17:22:21.179Z] <<< HTTP RESPONSE BODY code=400, message=Request contains an invalid argument., status=INVALID_ARGUMENT

+1 рдореЗрд░реЗ рд▓рд┐рдП, рдФрд░ рдПрдХ рдорд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рднреА, рдЖрдЬ рд╕реБрдмрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрдм рдпрд╣ рдХрд▓ рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореБрдЭреЗ https://status.firebase.google.com рдкрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ, рдХреНрдпрд╛ рдлрд╛рдпрд░рдмреЗрд╕ рд╕реЗ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдореЗрд░реЗ рд▓рд┐рдП +1 - рдЕрдЪрд╛рдирдХ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред 6.0.1 рд╕реЗ 6.1.0 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдФрд░ рдЕрдм firebase serve рднреА рдореБрдЭреЗ рдпрд╣ рд╕рдВрджреЗрд╢ рджреЗрддрд╛ рд╣реИ:

 functions: Preparing to emulate functions.
тЪа  Setup required, please run: firebase setup:emulators:firestore

рдореИрдВ рдЙрд╕ рдЖрджреЗрд╢ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЬрдм рдореИрдВ firebase serve рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИ:

i  functions: Preparing to emulate functions.
тЬФ  firestore: started on http://localhost:8080
тЪа  firestore: Error: Invalid or corrupt jarfile /home/alex/.cache/firebase/emulators/cloud-firestore-emulator-v1.2.1.jar

рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЕрднреА-рдЕрднреА рдЪрд▓рд╛рдП рдЧрдП рдЖрджреЗрд╢ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рдпрд╣ рдкреГрд╖реНрда рдорд┐рд▓рд╛: https://firebase.google.com/docs/firestore/security/test-rules-emulator

рдореИрдВрдиреЗ firebase --open-sesame emulators рдпрд╣ рд╕реЛрдЪрдХрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдпрд╣ 6.1.0 рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рдереА рдФрд░ рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА:

Error: Did not recognize preview feature

+1 рд╡рд╣реА рдореБрджреНрджрд╛, рдЖрдЬ рд╕реБрдмрд╣ рд╢реБрд░реВ рд╣реБрдЖ

+1ред рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ firebase-tools рд╕рдВрд╕реНрдХрд░рдгреЛрдВ v6.0.1 рдФрд░ v6.1.0 рдХреЗ рд╕рд╛рде firebase serve рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, firebase serve рдХрдорд╛рдВрдб рдиреЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдареАрдХ рд╕реЗ рдмрдВрдж рдХрд┐рдП рдмрд┐рдирд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рд░реНрд╡рд┐рдВрдЧ рдкреЛрд░реНрдЯреНрд╕ рдХреЛ рдЦреЛрд▓рддрд╛ рд╣реИ, рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдореИрдиреНрдпреБрдЕрд▓ рд╣рддреНрдпрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдмрд╕ рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ рднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИред рдлрд╛рдпрд░рдмреЗрд╕ рд╕рд░реНрд╡ рдХрд▓ рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред рдпрд╣ рджреЛрдиреЛрдВ рдлрд╛рдпрд░рдмреЗрд╕ 6.0.1 рдФрд░ 6.1.0 . рдкрд░ рд╣реИ

рдореЗрд░рд╛ рдареАрдХ рдпрд╣реА рдореБрджреНрджрд╛ рд╣реИред

рд╡реИрд╕рд╛ рд╣реА!

рд╡рд╣реАред рдореИрдВ рдЕрднреА рддреИрдирд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

рдореИрдВ рднреА:

image

рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдзреНрдпрд╛рди рдореЗрдВ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред рд╣рдо рдЕрднреА рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╕рдХреНрд░рд┐рдпрддрд╛ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

(рдЖрдВрддрд░рд┐рдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдВрдЦреНрдпрд╛: 119615185)

@Neilpoulin рдЖрдк рддреИрдирд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ? рдЖрдк рд╕реАрдПрд▓рдЖрдИ рдХреЗ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдХреМрди рд╕реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ?

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ- рдпрд╣ рд╕реАрдзреЗ рдлрд╛рдпрд░ рдмреЗрд╕ рдбрд┐рдкреНрд▓реЙрдп рдХрдорд╛рдВрдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред рдореЗрд░рд╛ рдирд┐рд░реНрдорд╛рдг
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рдЪрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдЗрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкрдХрдбрд╝ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ I
рддреИрдирд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред
рдЧреБрд░реБ, рдирд╡рдВрдмрд░ 15, 2018 рдЕрдкрд░рд╛рд╣реНрди 12:10 рдмрдЬреЗ рдорд╛рдЗрдХрд▓ рдмреНрд▓реЗрдШ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com . рдкрд░
рд▓рд┐рдЦрд╛ рдерд╛:

@Neilpoulin https://github.com/Neilpoulin рдЖрдк рддреИрдирд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ? рдХреНрдпрд╛
рд╕реАрдПрд▓рдЖрдИ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ?

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/firebase/firebase-tools/issues/1015#issuecomment-439155616 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAw-atNnP6wSmeHQke6z4EKIsx1D6r7Yks5uvbw_gaJpZM4Ygu-y
.

рдЕрдЧрд░ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ рддреЛ рдЖрдк рдЗрд╕ рджреМрд░рд╛рди рдмрдВрджрд░рдЧрд╛рд╣ рдХреЛ рдордЬрдмреВрд░ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рддреИрдирд╛рддреА рдпрд╛ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг:
рд╕реБрдбреЛ рдлрд╛рдпрд░рдмреЗрд╕ рд╕рд░реНрд╡ - рдХреЗрд╡рд▓ рдХрд╛рд░реНрдп --рдкреЛрд░реНрдЯ = 9000

рд╡рд╣реА рдореБрджреНрджрд╛ ... рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдХрд╛рд░рдг рд╣рдорд╛рд░рд╛ рд╡рд┐рдХрд╛рд╕ рд░реБрдХ рдЧрдпрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рдордЧреНрд░реА рдХреА рд╕реЗрд╡рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╛рдпрд░рдмреЗрд╕ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣реЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдгреАрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлрд╛рдпрд░рдмреЗрд╕ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рд╕реНрдЯреЗрдЯрд╕ рдбреИрд╢рдмреЛрд░реНрдб рд╕рднреА рд╣рд░реЗ рд░рдВрдЧ рдХрд╛ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИред рдХрд▓ рддрдХ рд╕рдм рдареАрдХ рдЪрд▓ рд░рд╣рд╛ рдерд╛ред

рдпрд╣ рдЕрдм рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде...

тЪа  database: WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by io.netty.util.internal.ReflectionUtil (file:/Users/rodrigodutra/.cache/firebase/emulators/firebase-database-emulator-v3.5.0.jar) to field sun.nio.ch.SelectorImpl.selectedKeys
WARNING: Please consider reporting this to the maintainers of io.netty.util.internal.ReflectionUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
тЪа  database:
...

рдореБрдЭреЗ рдЕрдм рдЕрд╡реИрдз рддрд░реНрдХ 400 рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдПрдХ рдФрд░ рдЕрднреА рднреА рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ:

2018-11-15T20:01:14.098Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer, Origin,Accept-Encoding, date=Thu, 15 Nov 2018 20:01:22 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="44,43,39,35", accept-ranges=none, connection=close
[2018-11-15T20:01:14.098Z] Starting @google-cloud/functions-emulator
[2018-11-15T20:01:14.115Z] Parsing function triggers
Warning: You're using Node.js v10.13.0 but Google Cloud Functions only supports v6.11.5.
[2018-11-15T20:01:14.238Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer, Origin,Accept-Encoding, date=Thu, 15 Nov 2018 20:01:22 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="44,43,39,35", accept-ranges=none, connection=close
i  hosting: Serving hosting files from: public
тЬФ  hosting: Local server: http://localhost:5000
тЪа  database: WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by io.netty.util.internal.ReflectionUtil (file:/home/qkay/.cache/firebase/emulators/firebase-database-emulator-v3.5.0.jar) to field sun.nio.ch.SelectorImpl.selectedKeys
WARNING: Please consider reporting this to the maintainers of io.netty.util.internal.ReflectionUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
тЪа  database: 

error: SUPERVISOR error Error: listen EADDRINUSE 127.0.0.1:5001
    at Server.setupListenHandle [as _listen2] (net.js:1286:14)
    at listenInCluster (net.js:1334:12)
    at GetAddrInfoReqWrap.doListen [as callback] (net.js:1460:7)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:62:10)
error: supervisorPort (5001) is already in use
error: restPort (5002) is already in use
12:01:15.254 [NamespaceSystem-akka.actor.default-dispatcher-3] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started

12:01:15.408 [main] INFO com.firebase.server.forge.App$ - Listening on port 9000

12:01:15.438 [main] ERROR com.firebase.server.forge.App$ - Error initializing Netty Listener
java.net.BindException: Address already in use
    at java.base/sun.nio.ch.Net.bind0(Native Method)
    at java.base/sun.nio.ch.Net.bind(Net.java:461)
    at java.base/sun.nio.ch.Net.bind(Net.java:453)
    at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227)
    at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:128)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:500)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1226)
    at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:495)
    at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:480)
    at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:973)
    at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:209)
    at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:355)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:399)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:464)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:131)
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
    at java.base/java.lang.Thread.run(Thread.java:834)

12:01:15.440 [Thread-1] INFO com.firebase.server.forge.App$ - Attempting graceful shutdown.

12:01:15.444 [NamespaceSystem-akka.actor.default-dispatcher-4] INFO akka.actor.CoordinatedShutdown - Starting coordinated shutdown from JVM shutdown hook

12:01:15.448 [Thread-1] INFO com.firebase.server.forge.App$ - Graceful shutdown complete.


Error: database: emulator has exited with code: 1

рдореБрдЭреЗ рдЕрдм рдЕрд╡реИрдз рддрд░реНрдХ 400 рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдПрдХ рдФрд░ рдЕрднреА рднреА рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ:

2018-11-15T20:01:14.098Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer, Origin,Accept-Encoding, date=Thu, 15 Nov 2018 20:01:22 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="44,43,39,35", accept-ranges=none, connection=close
[2018-11-15T20:01:14.098Z] Starting @google-cloud/functions-emulator
[2018-11-15T20:01:14.115Z] Parsing function triggers
Warning: You're using Node.js v10.13.0 but Google Cloud Functions only supports v6.11.5.
[2018-11-15T20:01:14.238Z] <<< HTTP RESPONSE 200 content-type=application/json; charset=UTF-8, vary=X-Origin, Referer, Origin,Accept-Encoding, date=Thu, 15 Nov 2018 20:01:22 GMT, server=ESF, cache-control=private, x-xss-protection=1; mode=block, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="44,43,39,35", accept-ranges=none, connection=close
i  hosting: Serving hosting files from: public
тЬФ  hosting: Local server: http://localhost:5000
тЪа  database: WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by io.netty.util.internal.ReflectionUtil (file:/home/qkay/.cache/firebase/emulators/firebase-database-emulator-v3.5.0.jar) to field sun.nio.ch.SelectorImpl.selectedKeys
WARNING: Please consider reporting this to the maintainers of io.netty.util.internal.ReflectionUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
тЪа  database: 

error: SUPERVISOR error Error: listen EADDRINUSE 127.0.0.1:5001
    at Server.setupListenHandle [as _listen2] (net.js:1286:14)
    at listenInCluster (net.js:1334:12)
    at GetAddrInfoReqWrap.doListen [as callback] (net.js:1460:7)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:62:10)
error: supervisorPort (5001) is already in use
error: restPort (5002) is already in use
12:01:15.254 [NamespaceSystem-akka.actor.default-dispatcher-3] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started

12:01:15.408 [main] INFO com.firebase.server.forge.App$ - Listening on port 9000

12:01:15.438 [main] ERROR com.firebase.server.forge.App$ - Error initializing Netty Listener
java.net.BindException: Address already in use
  at java.base/sun.nio.ch.Net.bind0(Native Method)
  at java.base/sun.nio.ch.Net.bind(Net.java:461)
  at java.base/sun.nio.ch.Net.bind(Net.java:453)
  at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227)
  at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:128)
  at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:500)
  at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1226)
  at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:495)
  at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:480)
  at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:973)
  at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:209)
  at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:355)
  at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:399)
  at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:464)
  at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:131)
  at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
  at java.base/java.lang.Thread.run(Thread.java:834)

12:01:15.440 [Thread-1] INFO com.firebase.server.forge.App$ - Attempting graceful shutdown.

12:01:15.444 [NamespaceSystem-akka.actor.default-dispatcher-4] INFO akka.actor.CoordinatedShutdown - Starting coordinated shutdown from JVM shutdown hook

12:01:15.448 [Thread-1] INFO com.firebase.server.forge.App$ - Graceful shutdown complete.


Error: database: emulator has exited with code: 1

рдЕрдкрдиреЗ рдореИрдХ рдХреЛ рд░рд┐рдмреВрдЯ рдХрд░реЗрдВ ...

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдЬрд╛рдд рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП firebase serve --only hosting рдпрд╛ firebase serve --only functions рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдЕрдм рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд┐рдХреНрд╕ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред

рдореБрдЭреЗ рднреА рд╕рдорд╕реНрдпрд╛ рдереА; рдЕрднреА-рдЕрднреА рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рд░рд┐рдмреВрдЯ рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@Neilpoulin рдЖрдк рддреИрдирд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ? рдЖрдк рд╕реАрдПрд▓рдЖрдИ рдХреЗ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдХреМрди рд╕реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рд░рд╣реА рд╣реИ?

@mbleeigh рдЕрдм рдЖрдкрдХреЛ рдФрд░ рд╡рд┐рд╡рд░рдг рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реВрдВ:

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВ рдиреЛрдб рдореЗрдВ firebase-tools рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВред рдЬреЛ рдЖрджреЗрд╢ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ:

рдЬрдм рдореБрдЭреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рддреЛ firbase-tools рд╕рдВрд╕реНрдХрд░рдг 6.0.1 ред рдлрд┐рд░ рдореИрдВрдиреЗ рдЗрд╕реЗ 6.1.0 рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рд╡рд╣реА рдереАред

const fbcli = require("firebase-tools");
const opts = {"project": "stage"}; //this is an active alias for my firebase setup
return fbcli.setup
    .web(opts)
    .then(firebaseConfig => { 
        // some config setup stuff for webpack
    }.catch(error => {
        //This gets called rigt away, see error object below
        console.error(error);
    })

рдЬрд╣рд╛рдВ рдкрдХрдбрд╝реА рдЧрдИ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрддреА рд╣реИ:

{
  "name": "FirebaseError",
  "message": "HTTP Error: 400, Request contains an invalid argument.",
  "children": [],
  "status": 500,
  "exit": 1,
  "stack": "Error\n    at new FirebaseError (/Users/myrepo/node_modules/firebase-tools/src/error.js:11:16)\n    at module.exports (/Users/myrepo/node_modules/firebase-tools/src/responseToError.js:46:10)\n    at Request._callback (/Users/myrepo/node_modules/firebase-tools/src/api.js:50:25)\n    at Request.self.callback (/Users/myrepo/node_modules/request/request.js:185:22)\n    at emitTwo (events.js:126:13)\n    at Request.emit (events.js:214:7)\n    at Request.<anonymous> (/Users/myrepo/node_modules/request/request.js:1161:10)\n    at emitOne (events.js:116:13)\n    at Request.emit (events.js:211:7)\n    at IncomingMessage.<anonymous> (/Users/myrepo/node_modules/request/request.js:1083:12)",
  "context": {
    "body": {
      "error": {
        "code": 400,
        "message": "Request contains an invalid argument.",
        "status": "INVALID_ARGUMENT"
      }
    },
    "response": {
      "statusCode": 400,
      "body": {
        "error": {
          "code": 400,
          "message": "Request contains an invalid argument.",
          "status": "INVALID_ARGUMENT"
        }
      },
      "headers": {
        "vary": "X-Origin, Referer, Origin,Accept-Encoding",
        "content-type": "application/json; charset=UTF-8",
        "date": "Thu, 15 Nov 2018 18:33:41 GMT",
        "server": "ESF",
        "cache-control": "private",
        "x-xss-protection": "1; mode=block",
        "x-frame-options": "SAMEORIGIN",
        "x-content-type-options": "nosniff",
        "alt-svc": "quic=\":443\"; ma=2592000; v=\"44,43,39,35\"",
        "accept-ranges": "none",
        "connection": "close"
      },
      "request": {
        "uri": {
          "protocol": "https:",
          "slashes": true,
          "auth": null,
          "host": "mobilesdk-pa.googleapis.com",
          "port": 443,
          "hostname": "mobilesdk-pa.googleapis.com",
          "hash": null,
          "search": null,
          "query": null,
          "pathname": "/v1/projects/465836249868/clients/_:getWebAppConfig",
          "path": "/v1/projects/465836249868/clients/_:getWebAppConfig",
          "href": "https://mobilesdk-pa.googleapis.com/v1/projects/465836249868/clients/_:getWebAppConfig"
        },
        "method": "GET"
      }
    }
  }
}

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ 1:16 рдмрдЬреЗ рдПрдордЯреА, рдореИрдВ рдЕрдм рдпрд╣ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ

рд╣рдордиреЗ рдмреИрдХрдПрдВрдб рдмрд┐рд▓реНрдб рдХреЛ рд╡рд╛рдкрд╕ рд▓реЗ рд▓рд┐рдпрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрди рд░рд╣рд╛ рдерд╛ред рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЕрднреА рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рднреА рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ?

рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛

+1 рдЕрдм рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж

+1 рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХреАред

+1 рд╡рд╛рдкрд╕ рд╡реНрдпрд╡рд╕рд╛рдпреЛрдВ рдореЗрдВ

@ryanpbrewster рд╣рд╛рдБ рдпрд╣ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж! рдЖрдк рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдЙрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ e2e рдкрд░реАрдХреНрд╖рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдкреАрдПрд╕: рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд░рд┐рдмреВрдЯ рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреБрдЫ рд▓рдЯрдХрддреА рд╣реБрдИ рдиреЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдорд┐рд▓реА рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ firebase serve рд╕реЗ рдкрд╣рд▓реЗ рдорд╛рд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рд░рд┐рдмреВрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдкрд┐рдЫрд▓реЗ рддреИрдирд╛рддреА рдкреНрд░рдпрд╛рд╕реЛрдВ рд╕реЗ рдЪрд▓ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдереАрдВред рдореИрдВ рдмрд╕ рд╢реАрд░реНрд╖ рдкрд░ рдЧрдпрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдорд╛рд░ рдбрд╛рд▓рд╛ рдФрд░ рдЕрдм рдлрд╛рдпрд░рдмреЗрд╕ рдЙрдкрдХрд░рдг рдореЗрд░реЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред

+1 рд╕рдм рд╕реЗрдЯ! рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

рдЖрдкрдХреЗ рдзреИрд░реНрдп рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рджред рдЕрдорд╛рдиреНрдп рддрд░реНрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

5 рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, 'рдлрд╛рдпрд░рдмреЗрд╕ рдкрд░рд┐рдирд┐рдпреЛрдЬрди' рдкрд░ред

рд╕рдорд╛рд░реЛрд╣ рд╣реИ:

exports.makeUppercase = functions.database.ref('/userfollowers/{pushId}/followers')
    .onWrite((change, context) => {
      // Only edit data when it is first created.
      if (change.before.exists()) {
        return null;
      }
      // Exit when the data is deleted.
      if (!change.after.exists()) {
        return null;
      }
      // Grab the current value of what was written to the Realtime Database.
      const original = change.after.val();
      console.log('Uppercasing', context.params.pushId, original);
      const uppercase = original.toUpperCase();
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to the Firebase Realtime Database.
      // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
      return change.after.ref.parent.child('uppercase').set(uppercase);
    });

рдЬреЛ рд╕реАрдзреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред

рдЯрд░реНрдорд┐рдирд▓ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

тЪа  functions: failed to create function makeUppercase
HTTP Error: 400, The request has errors

рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдЧ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ:
{"@type":"type.googleapis.com/google.cloud.audit.AuditLog","status":{"code":3,"message":"INVALID_ARGUMENT"},"authenticationInfo":{"principalEmail":"[email protected]"},"requestMetadata":{"callerIp":"86.120.235.246","callerSuppliedUserAgent":"FirebaseCLI/3.19.0,gzip(gfe),gzip(gfe)","requestAttributes":{"time":"2019-05-14T08:34:18.563Z","auth":{}},"destinationAttributes":{}},"serviceName":"cloudfunctions.googleapis.com","methodName":"google.cloud.functions.v1.CloudFunctionsService.CreateFunction","authorizationInfo":[{"resource":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase","permission":"cloudfunctions.functions.create","granted":true,"resourceAttributes":{}},{"permission":"cloudfunctions.functions.create","granted":true,"resourceAttributes":{}}],"resourceName":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase","request":{"location":"projects/parkour-9136c/locations/us-central1","@type":"type.googleapis.com/google.cloud.functions.v1.CreateFunctionRequest","function":{"labels":{"deployment-tool":"cli-firebase"},"entryPoint":"makeUppercase","eventTrigger":{"eventType":"providers/google.firebase.database/eventTypes/ref.write","resource":"projects/_/instances/parkour-9136c/refs/userfollowers/{pushId}/followers","service":"firebaseio.com"},"sourceUploadUrl":"https://storage.googleapis.com/gcf-upload-us-central1-f5adb7fe-7321-4f3c-8fe0-2b2307d26138/5b099ea8-161b-44a7-a3bd-18ce75c64859.zip?GoogleAccessId=service-807137615499@gcf-admin-robot.iam.gserviceaccount.com&Expires=1557824657&Signature=PJKzJsZtHWO1kIkmrSojpdgvb0jRzV91eNC9rZc4j%2FMcoHjILGm36FKCt6qQ2fxeAUu1%2FbrxpagdI7fHmUUUrDdTmnTNISr7FiN61sifUI%2B%2FGnUwo8SguzvrA7kADFqu8nD05FAo7BvG7biUrHmLgISlwo5dTKqcTSmExnaICA1tHYxjz%2Fk0RbmdGkcQ5HdeCKBnW0R7wQPsxswQyvR4cAU4WD2m3PPM9lncVr7pB%2Fh77FboGLi3sq%2FGHyEwUtjfUmyN9d%2FYUpKs48TMsGPknAGIvaFFUWQR23YCDUcrPipq1nW2W1JUdf5nGylYmVEeyF3jLrm%2BsOIcXiZ6LCRhpg%3D%3D","name":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase"}}}

рдХреНрдпрд╛ рдирд┐рджрд╛рди рд╣реИ?
рдзрдиреНрдпрд╡рд╛рдж

@nicoara рдХреГрдкрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдЕрдВрдХ рдЦреЛрд▓реЗрдВред рд╢реБрдХреНрд░рд┐рдпрд╛ред

5 рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, 'рдлрд╛рдпрд░рдмреЗрд╕ рдкрд░рд┐рдирд┐рдпреЛрдЬрди' рдкрд░ред

рд╕рдорд╛рд░реЛрд╣ рд╣реИ:

exports.makeUppercase = functions.database.ref('/userfollowers/{pushId}/followers')
    .onWrite((change, context) => {
      // Only edit data when it is first created.
      if (change.before.exists()) {
        return null;
      }
      // Exit when the data is deleted.
      if (!change.after.exists()) {
        return null;
      }
      // Grab the current value of what was written to the Realtime Database.
      const original = change.after.val();
      console.log('Uppercasing', context.params.pushId, original);
      const uppercase = original.toUpperCase();
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to the Firebase Realtime Database.
      // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
      return change.after.ref.parent.child('uppercase').set(uppercase);
    });

рдЬреЛ рд╕реАрдзреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред

рдЯрд░реНрдорд┐рдирд▓ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

тЪа  functions: failed to create function makeUppercase
HTTP Error: 400, The request has errors

рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдЧ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ:
{"@type":"type.googleapis.com/google.cloud.audit.AuditLog","status":{"code":3,"message":"INVALID_ARGUMENT"},"authenticationInfo":{"principalEmail":"[email protected]"},"requestMetadata":{"callerIp":"86.120.235.246","callerSuppliedUserAgent":"FirebaseCLI/3.19.0,gzip(gfe),gzip(gfe)","requestAttributes":{"time":"2019-05-14T08:34:18.563Z","auth":{}},"destinationAttributes":{}},"serviceName":"cloudfunctions.googleapis.com","methodName":"google.cloud.functions.v1.CloudFunctionsService.CreateFunction","authorizationInfo":[{"resource":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase","permission":"cloudfunctions.functions.create","granted":true,"resourceAttributes":{}},{"permission":"cloudfunctions.functions.create","granted":true,"resourceAttributes":{}}],"resourceName":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase","request":{"location":"projects/parkour-9136c/locations/us-central1","@type":"type.googleapis.com/google.cloud.functions.v1.CreateFunctionRequest","function":{"labels":{"deployment-tool":"cli-firebase"},"entryPoint":"makeUppercase","eventTrigger":{"eventType":"providers/google.firebase.database/eventTypes/ref.write","resource":"projects/_/instances/parkour-9136c/refs/userfollowers/{pushId}/followers","service":"firebaseio.com"},"sourceUploadUrl":"https://storage.googleapis.com/gcf-upload-us-central1-f5adb7fe-7321-4f3c-8fe0-2b2307d26138/5b099ea8-161b-44a7-a3bd-18ce75c64859.zip?GoogleAccessId=service-807137615499@gcf-admin-robot.iam.gserviceaccount.com&Expires=1557824657&Signature=PJKzJsZtHWO1kIkmrSojpdgvb0jRzV91eNC9rZc4j%2FMcoHjILGm36FKCt6qQ2fxeAUu1%2FbrxpagdI7fHmUUUrDdTmnTNISr7FiN61sifUI%2B%2FGnUwo8SguzvrA7kADFqu8nD05FAo7BvG7biUrHmLgISlwo5dTKqcTSmExnaICA1tHYxjz%2Fk0RbmdGkcQ5HdeCKBnW0R7wQPsxswQyvR4cAU4WD2m3PPM9lncVr7pB%2Fh77FboGLi3sq%2FGHyEwUtjfUmyN9d%2FYUpKs48TMsGPknAGIvaFFUWQR23YCDUcrPipq1nW2W1JUdf5nGylYmVEeyF3jLrm%2BsOIcXiZ6LCRhpg%3D%3D","name":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase"}}}

рдХреНрдпрд╛ рдирд┐рджрд╛рди рд╣реИ?
рдзрдиреНрдпрд╡рд╛рдж

5 рдШрдВрдЯреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, 'рдлрд╛рдпрд░рдмреЗрд╕ рдкрд░рд┐рдирд┐рдпреЛрдЬрди' рдкрд░ред

рд╕рдорд╛рд░реЛрд╣ рд╣реИ:

exports.makeUppercase = functions.database.ref('/userfollowers/{pushId}/followers')
    .onWrite((change, context) => {
      // Only edit data when it is first created.
      if (change.before.exists()) {
        return null;
      }
      // Exit when the data is deleted.
      if (!change.after.exists()) {
        return null;
      }
      // Grab the current value of what was written to the Realtime Database.
      const original = change.after.val();
      console.log('Uppercasing', context.params.pushId, original);
      const uppercase = original.toUpperCase();
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to the Firebase Realtime Database.
      // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
      return change.after.ref.parent.child('uppercase').set(uppercase);
    });

рдЬреЛ рд╕реАрдзреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред

рдЯрд░реНрдорд┐рдирд▓ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

тЪа  functions: failed to create function makeUppercase
HTTP Error: 400, The request has errors

рдХреНрд▓рд╛рдЙрдб рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдЧ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ:
{"@type":"type.googleapis.com/google.cloud.audit.AuditLog","status":{"code":3,"message":"INVALID_ARGUMENT"},"authenticationInfo":{"principalEmail":"[email protected]"},"requestMetadata":{"callerIp":"86.120.235.246","callerSuppliedUserAgent":"FirebaseCLI/3.19.0,gzip(gfe),gzip(gfe)","requestAttributes":{"time":"2019-05-14T08:34:18.563Z","auth":{}},"destinationAttributes":{}},"serviceName":"cloudfunctions.googleapis.com","methodName":"google.cloud.functions.v1.CloudFunctionsService.CreateFunction","authorizationInfo":[{"resource":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase","permission":"cloudfunctions.functions.create","granted":true,"resourceAttributes":{}},{"permission":"cloudfunctions.functions.create","granted":true,"resourceAttributes":{}}],"resourceName":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase","request":{"location":"projects/parkour-9136c/locations/us-central1","@type":"type.googleapis.com/google.cloud.functions.v1.CreateFunctionRequest","function":{"labels":{"deployment-tool":"cli-firebase"},"entryPoint":"makeUppercase","eventTrigger":{"eventType":"providers/google.firebase.database/eventTypes/ref.write","resource":"projects/_/instances/parkour-9136c/refs/userfollowers/{pushId}/followers","service":"firebaseio.com"},"sourceUploadUrl":"https://storage.googleapis.com/gcf-upload-us-central1-f5adb7fe-7321-4f3c-8fe0-2b2307d26138/5b099ea8-161b-44a7-a3bd-18ce75c64859.zip?GoogleAccessId=service-807137615499@gcf-admin-robot.iam.gserviceaccount.com&Expires=1557824657&Signature=PJKzJsZtHWO1kIkmrSojpdgvb0jRzV91eNC9rZc4j%2FMcoHjILGm36FKCt6qQ2fxeAUu1%2FbrxpagdI7fHmUUUrDdTmnTNISr7FiN61sifUI%2B%2FGnUwo8SguzvrA7kADFqu8nD05FAo7BvG7biUrHmLgISlwo5dTKqcTSmExnaICA1tHYxjz%2Fk0RbmdGkcQ5HdeCKBnW0R7wQPsxswQyvR4cAU4WD2m3PPM9lncVr7pB%2Fh77FboGLi3sq%2FGHyEwUtjfUmyN9d%2FYUpKs48TMsGPknAGIvaFFUWQR23YCDUcrPipq1nW2W1JUdf5nGylYmVEeyF3jLrm%2BsOIcXiZ6LCRhpg%3D%3D","name":"projects/parkour-9136c/locations/us-central1/functions/makeUppercase"}}}

рдХреНрдпрд╛ рдирд┐рджрд╛рди рд╣реИ?
рдзрдиреНрдпрд╡рд╛рдж

рдбреАрдмреА рд░реЗрдлрд░реА рдкрде рдХреЗ рдЕрдВрдд рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП /userfollowers/{pushId}/followers/{follower}

@bkendall рдореИрдВрдиреЗ рдПрдХ рдирдпрд╛ рд╕реВрддреНрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛: https://github.com/firebase/firebase-tools/issues/1317

рдореИрдВрдиреЗ 'рдлрд╝рд╛рдпрд░рдмреЗрд╕ рдкрд░рд┐рдирд┐рдпреЛрдЬрди --debug' рдЪрд▓рд╛рдпрд╛ рдФрд░ рдПрдХ рдирдпрд╛ рд╕рдВрджреЗрд╢ рдкрд╛рдпрд╛ред

[2019-05-20T14:43:23.863Z] <<< HTTP RESPONSE 400 vary=X-Origin, Referer, Origin,Accept-Encoding, content-type=application/json; charset=UTF-8, date=Mon, 20 May 2019 14:43:23 GMT, server=ESF, cache-control=private, x-xss-protection=0, x-frame-options=SAMEORIGIN, x-content-type-options=nosniff, alt-svc=quic=":443"; ma=2592000; v="46,44,43,39", accept-ranges=none, connection=close
[2019-05-20T14:43:23.863Z] <<< HTTP RESPONSE BODY code=400, message=The request has errors, status=INVALID_ARGUMENT, details=[@type=type.googleapis.com/google.rpc.BadRequest, fieldViolations=[field=runtime, description=Runtime field cannot be empty.]]
тЪа  functions: failed to create function makeUppercase
HTTP Error: 400, The request has errors

@soclbz рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред

рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж

рд╕рдорд╛рди _"рд░рдирдЯрд╛рдЗрдо рдлрд╝реАрд▓реНрдб рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛"_ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:

[2019-06-06рдЯреА18:51:31.127рдЬреЗрдб] <<< HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 400 рднрд┐рдиреНрди = рдПрдХреНрд╕-рдЙрддреНрдкрддреНрддрд┐, рд╕рдВрджрд░реНрднрдХрд░реНрддрд╛, рдЙрддреНрдкрддреНрддрд┐, рд╕реНрд╡реАрдХреГрддрд┐-рдПрдиреНрдХреЛрдбрд┐рдВрдЧ, рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ = рдЖрд╡реЗрджрди/рдЬреЗрд╕рди; рд╡рд░реНрдгрд╕реЗрдЯ = UTF-8, рджрд┐рдирд╛рдВрдХ = рдЧреБрд░реБ, 06 рдЬреВрди 2019 18:51:30 GMT, рд╕рд░реНрд╡рд░ = ESF, рдХреИрд╢реЗ-рдирд┐рдпрдВрддреНрд░рдг = рдирд┐рдЬреА, x-xss-рд╕реБрд░рдХреНрд╖рд╛ = 0, x-рдлреНрд░реЗрдо-рд╡рд┐рдХрд▓реНрдк = SAMEORIGIN, x-рд╕рд╛рдордЧреНрд░реА- рдкреНрд░рдХрд╛рд░-
рд╡рд┐рдХрд▓реНрдк = nosniff, alt-svc=quic=":443"; рдорд╛ = 2592000; v="46,44,43,39", рдПрдХреНрд╕реЗрдкреНрдЯ-рд░реЗрдВрдЬ=рдХреЛрдИ рдирд╣реАрдВ, рдХрдиреЗрдХреНрд╢рди=рдХрд░реАрдм
[2019-06-06рдЯреА18:51:31.128рдЬреЗрдб] <<< HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмреЙрдбреА рдХреЛрдб = 400, рд╕рдВрджреЗрд╢ = рдЕрдиреБрд░реЛрдз рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ, рд╕реНрдерд┐рддрд┐ = INVALID_ARGUMENT, рд╡рд┐рд╡рд░рдг = [@type=type.googleapis.com/google.rpc.BadRequest , рдлрд╝реАрд▓реНрдб рдЙрд▓реНрд▓рдВрдШрди = [рдлрд╝реАрд▓реНрдб = рд░рдирдЯрд╛рдЗрдо, рд╡рд┐рд╡рд░рдг = рд░рдирдЯрд╛рдЗрдо рдлрд╝реАрд▓реНрдб рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред]]

рдпрд╣ рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдЙрджрд╛рд╣рд░рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп npx firebase init рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд╡ рдирд┐рд░реНрдорд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рд╣реЛрддрд╛ рд╣реИред

@stpch рдХреНрдпрд╛ рдЖрдк CLI рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╣реИрдВ? рдХреГрдкрдпрд╛ #1317 . рджреЗрдЦреЗрдВ

@stpch рдХреНрдпрд╛ рдЖрдк CLI рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╣реИрдВ? рдХреГрдкрдпрд╛ #1317 . рджреЗрдЦреЗрдВ

рдореИрдВ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

рдореЗрд░рд╛ рдмреБрд░рд╛ рд╣реИ, рд╡рд╣рд╛рдБ рдПрдХ рдкреБрд░рд╛рдиреЗ рдерд╛ firebase-tools рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд yarn рдХрд┐ рдкрд░ рдкреВрд░реНрд╡рддрд╛ рд▓реЗ рд▓рд┐рдпрд╛ npx ред рдпрд╣ рдЕрдм рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

ahmadalibaloch picture ahmadalibaloch  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

laurenzlong picture laurenzlong  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jkeys089 picture jkeys089  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

FluorescentHallucinogen picture FluorescentHallucinogen  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

francisrod01 picture francisrod01  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ