1. рдЦрд╛рд╕ рдЬрд╛рдирдХрд╛рд░реА
рдЗрд╕ рдХреЛрдбрд▓реИрдм рдореЗрдВ, рдЖрдкрдХреЛ AngularFire рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛. рдЗрд╕рдХреЗ рд▓рд┐рдП, Firebase рдХреЗ рдкреНрд░реЙрдбрдХреНрдЯ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рдЪреИрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд▓рд╛рдЧреВ рдФрд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ.
рдЖрдкрдХреЛ рдХреНрдпрд╛ рд╕реАрдЦрдиреЗ рдХреЛ рдорд┐рд▓реЗрдЧрд╛
- Angular рдФрд░ Firebase рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛.
- Cloud Firestore рдФрд░ Cloud Storage for Firebase рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рд╕рд┐рдВрдХ рдХрд░реЗрдВ.
- Firebase рд╕реЗ рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ.
- рдЕрдкрдиреЗ рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ Firebase рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдВ.
- Firebase рдХреНрд▓рд╛рдЙрдб рд╕реЗ рдореИрд╕реЗрдЬ рдХреА рдорджрдж рд╕реЗ рд╕реВрдЪрдирд╛рдПрдВ рднреЗрдЬреЗрдВ.
- рдЖрдкрдХреЗ рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдкрд░рдлрд╝реЙрд░реНрдореЗрдВрд╕ рдХрд╛ рдбреЗрдЯрд╛ рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реИ.
рдЖрдкрдХреЛ рдЗрдирдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрдЧреА
- GitHub рдЦрд╛рддрд╛
- рдЕрдкрдиреЗ Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ Blaze рдкреНрд▓рд╛рди рдкрд░ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛
- рдЖрдкрдХреА рдкрд╕рдВрдж рдХрд╛ рдЖрдИрдбреАрдИ/рдЯреЗрдХреНрд╕реНрдЯ рдПрдбрд┐рдЯрд░, рдЬреИрд╕реЗ рдХрд┐ WebStorm, Sublime рдпрд╛ VS Code
- рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ npm, рдЬреЛ рдЖрдо рддреМрд░ рдкрд░ Node.js рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ
- рдЯрд░реНрдорд┐рдирд▓/рдХрдВрд╕реЛрд▓
- рдЕрдкрдиреА рдкрд╕рдВрдж рдХрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░, рдЬреИрд╕реЗ рдХрд┐ Chrome
- рдХреЛрдбрд▓реИрдм рдХрд╛ рд╕реИрдВрдкрд▓ рдХреЛрдб. рдХреЛрдб рдкрд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдбрд▓реИрдм рдХрд╛ рдЕрдЧрд▓рд╛ рдЪрд░рдг рджреЗрдЦреЗрдВ.
2. рд╕реИрдВрдкрд▓ рдХреЛрдб рдкрд╛рдирд╛
GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдмрдирд╛рдирд╛
рдХреЛрдбрд▓реИрдм рдХрд╛ рд╕реЛрд░реНрд╕ https://github.com/firebase/codelab-friendlychat-web рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдЗрд╕ рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ, рдХрдИ рдкреНрд▓реИрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рд╕реИрдВрдкрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореМрдЬреВрдж рд╣реИрдВ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдХреЛрдбрд▓реИрдм рдореЗрдВ рд╕рд┐рд░реНрдлрд╝ angularfire-start
рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ.
angularfire-start
рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдЕрдкрдиреА рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ:
- рдЯрд░реНрдорд┐рдирд▓ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдПрдХ рдирдпрд╛ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВ рдФрд░ рдирдИ рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА рдореЗрдВ рдЬрд╛рдПрдВ:
mkdir codelab-friendlyeats-web cd codelab-friendlyeats-web
- рд╕рд┐рд░реНрдлрд╝
angularfire-start
рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдлрд╝реЗрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, giget npm рдкреИрдХреЗрдЬ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ:npx giget@latest gh:firebase/codelab-friendlychat-web/angularfire-start#master . --install
- git рдХреА рдорджрдж рд╕реЗ, рд▓реЛрдХрд▓ рддреМрд░ рдкрд░ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░реЗрдВ:
git init git add . git commit -m "codelab starting point" git branch -M main
- рдирдИ GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдмрдирд╛рдПрдВ: https://github.com/new. рдЗрд╕реЗ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХреЛрдИ рднреА рдирд╛рдо рджреЗрдВ.
- GitHub рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдпреВрдЖрд░рдПрд▓ рджреЗрдЧрд╛, рдЬреЛ
https://github.com/[user-name]/[repository-name].git
рдпрд╛git@github.com:[user-name]/[repository-name].git
рдЬреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛. рдЗрд╕ рдпреВрдЖрд░рдПрд▓ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ.
- GitHub рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдпреВрдЖрд░рдПрд▓ рджреЗрдЧрд╛, рдЬреЛ
- рдЕрдкрдиреА рдирдИ GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рдкреБрд╢ рдХрд░реЗрдВ. рдпрд╣рд╛рдВ рджреА рдЧрдИ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ. рдЗрд╕рдореЗрдВ
your-repository-url
рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреА рдЬрдЧрд╣ рдЕрдкрдиреЗ рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдХрд╛ рдпреВрдЖрд░рдПрд▓ рдбрд╛рд▓реЗрдВ.git remote add origin your-repository-url git push -u origin main
- рдЕрдм рдЖрдкрдХреЛ рдЕрдкрдиреА GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХреЛрдб рджрд┐рдЦреЗрдЧрд╛.
3. Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рдФрд░ рдЙрд╕реЗ рд╕реЗрдЯ рдЕрдк рдХрд░рдирд╛
Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛
- Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВ.
- Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЕрдкрдиреЗ Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо FriendlyChat рд░рдЦреЗрдВ. рдЕрдкрдиреЗ Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдпрд╛рдж рд░рдЦреЗрдВ.
- рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП Google Analytics рдЪрд╛рд▓реВ рдХрд░реЗрдВ рд╕реЗ рдЪреБрдиреЗ рд╣реБрдП рдХрд╛ рдирд┐рд╢рд╛рди рд╣рдЯрд╛рдПрдВ
- рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
рдЖрдкрдХреЛ рдЬрд┐рд╕ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрдирд╛рдирд╛ рд╣реИ рдЙрд╕рдореЗрдВ Firebase рдХреЗ рдРрд╕реЗ рдкреНрд░реЙрдбрдХреНрдЯ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:
- Firebase Authentication рдХреА рдорджрдж рд╕реЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдиреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕рд╛рдЗрди рдЗрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ.
- рдХреНрд▓рд╛рдЙрдб рдкрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдбреЗрдЯрд╛ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Cloud Firestore рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ. рд╕рд╛рде рд╣реА, рдбреЗрдЯрд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрдиреЗ рдкрд░ рддреБрд░рдВрдд рд╕реВрдЪрдирд╛ рдкрд╛рдПрдВ.
- рдХреНрд▓рд╛рдЙрдб рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Firebase рдХреЗ рд▓рд┐рдП Cloud Storage рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ.
- рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ, рд╣реЛрд╕реНрдЯ рдХрд░рдиреЗ, рдФрд░ рдЙрд╕реЗ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, Firebase App Hosting рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ.
- Firebase Cloud Messaging рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓, рдкреБрд╢ рдиреЛрдЯрд┐рдлрд╝рд┐рдХреЗрд╢рди рднреЗрдЬрдиреЗ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдкреЙрдк-рдЕрдк рдиреЛрдЯрд┐рдлрд╝рд┐рдХреЗрд╢рди рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ.
- Firebase Performance Monitoring рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдЕрдкрдиреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд░рдлрд╝реЙрд░реНрдореЗрдВрд╕ рдХрд╛ рдбреЗрдЯрд╛ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ.
рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдкреНрд░реЙрдбрдХреНрдЯ рдХреЗ рд▓рд┐рдП, рдЦрд╛рд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИ. рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрдиреНрд╣реЗрдВ Firebase рдХрдВрд╕реЛрд▓ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ.
Firebase рдХрд╛ рдкреНрд░рд╛рдЗрд╕рд┐рдВрдЧ рдкреНрд▓рд╛рди рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдирд╛
Firebase App Hosting рдФрд░ Cloud Storage for Firebase рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХрд╛ Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рд╢реБрд▓реНрдХ рдЪреБрдХрд╛рдиреЗ рд╡рд╛рд▓реЗ (рдмреНрд▓реЗрдЬрд╝) рдкреНрд▓рд╛рди рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП. рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ Cloud Billing рдЦрд╛рддреЗ рд╕реЗ рд▓рд┐рдВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП.
- Cloud Billing рдЦрд╛рддреЗ рдХреЗ рд▓рд┐рдП, рдкреЗрдореЗрдВрдЯ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдЬреЛрдбрд╝рдирд╛ рдЬрд╝рд░реВрд░реА рд╣реИ. рдЬреИрд╕реЗ, рдХреНрд░реЗрдбрд┐рдЯ рдХрд╛рд░реНрдб.
- рдЕрдЧрд░ рдЖрдкрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ Firebase рдФрд░ Google Cloud рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреЛ 300 рдбреЙрд▓рд░ рдХрд╛ рдХреНрд░реЗрдбрд┐рдЯ рдФрд░ рдореБрдлрд╝реНрдд рдореЗрдВ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП Cloud Billing рдЦрд╛рддрд╛ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ.
- рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рдХреЛрдбрд▓реИрдм рдХрд┐рд╕реА рдЗрд╡реЗрдВрдЯ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рддреМрд░ рдкрд░ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдЗрд╡реЗрдВрдЯ рдХреЗ рдЖрдпреЛрдЬрдХ рд╕реЗ рдкреВрдЫреЗрдВ рдХрд┐ рдХреНрдпрд╛ Cloud рдХреНрд░реЗрдбрд┐рдЯ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ.
рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ Blaze рдкреНрд▓рд╛рди рдкрд░ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рддрд░реАрдХрд╛ рдЕрдкрдирд╛рдПрдВ:
- Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЬрд╛рдХрд░, рдЕрдкрдиреЗ рдкреНрд▓рд╛рди рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░реЗрдВ.
- Blaze рдкреНрд▓рд╛рди рдЪреБрдиреЗрдВ. рдХрд┐рд╕реА Cloud Billing рдЦрд╛рддреЗ рдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ.
рдЕрдЧрд░ рдЖрдкрдХреЛ рдЗрд╕ рдЕрдкрдЧреНрд░реЗрдб рдХреЗ рджреМрд░рд╛рди Cloud Billing рдЦрд╛рддрд╛ рдмрдирд╛рдирд╛ рдкрдбрд╝рд╛ рд╣реИ, рддреЛ рдЕрдкрдЧреНрд░реЗрдб рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреА рдкреНрд░реЛрд╕реЗрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ.
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ Firebase рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЛрдбрд╝рдирд╛
- рдирдпрд╛ Firebase рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реЗрдм рдЖрдЗрдХреЙрди
рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
- рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ Friendly Chat рдирд┐рдХрдиреЗрдо рд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ. рдЗрд╕ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП Firebase Hosting рднреА рд╕реЗрдЯ рдЕрдк рдХрд░реЗрдВ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдореМрдЬреВрдж рдмреЙрдХреНрд╕ рдкрд░ рд╕рд╣реА рдХрд╛ рдирд┐рд╢рд╛рди рди рд▓рдЧрд╛рдПрдВ. рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
- рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ, рдЖрдкрдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рджрд┐рдЦреЗрдЧрд╛. рдлрд╝рд┐рд▓рд╣рд╛рд▓, рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ. рдХрдВрд╕реЛрд▓ рдкрд░ рдЬрд╛рдПрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рд╕реЗрдЯ рдЕрдк рдХрд░рдирд╛
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдкрдиреЗ Google рдЦрд╛рддреЛрдВ рд╕реЗ рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕рд╛рдЗрди рдЗрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Google рд╕рд╛рдЗрди-рдЗрди рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛.
- Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ, Authentication рдкрд░ рдЬрд╛рдПрдВ.
- рд╢реБрд░реВ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
- рдЕрдиреНрдп рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдХреЙрд▓рдо рдореЗрдВ, Google > рдЪрд╛рд▓реВ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
- рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдирд╛рдо рдЯреЗрдХреНрд╕реНрдЯ рдмреЙрдХреНрд╕ рдореЗрдВ, рдХреЛрдИ рдРрд╕рд╛ рдирд╛рдо рдбрд╛рд▓реЗрдВ рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдпрд╛рдж рд░рдЦрд╛ рдЬрд╛ рд╕рдХреЗ. рдЬреИрд╕реЗ,
My Next.js app
. - рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрддрд╛ рдИрдореЗрд▓ рдкрддрд╛ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реЗ, рдЕрдкрдирд╛ рдИрдореЗрд▓ рдкрддрд╛ рдЪреБрдиреЗрдВ.
- рд╕реЗрд╡ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
Cloud Firestore рд╕реЗрдЯ рдЕрдк рдХрд░рдирд╛
рдпрд╣ рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди, рдЪреИрдЯ рдореИрд╕реЗрдЬ рд╕реЗрд╡ рдХрд░рдиреЗ рдФрд░ рдирдП рдЪреИрдЯ рдореИрд╕реЗрдЬ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП Cloud Firestore рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ.
рдЕрдкрдиреЗ Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ Cloud Firestore рд╕реЗрдЯ рдЕрдк рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- Firebase рдХрдВрд╕реЛрд▓ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдореМрдЬреВрдж рдкреИрдирд▓ рдореЗрдВ, Build рдХреЛ рдмрдбрд╝рд╛ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, Firestore database рдХреЛ рдЪреБрдиреЗрдВ.
- рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдПрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
- рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрдИрдбреА рдХреЛ
(default)
рдкрд░ рд╕реЗрдЯ рд░рд╣рдиреЗ рджреЗрдВ. - рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬрдЧрд╣ рдЪреБрдиреЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдЧреЗ рдмрдврд╝реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
рдХрд┐рд╕реА рдЕрд╕рд▓реА рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдРрд╕реА рдЬрдЧрд╣ рдЪреБрдирдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЖрд╕-рдкрд╛рд╕ рд╣реЛ. - рдЯреЗрд╕реНрдЯ рдореЛрдб рдореЗрдВ рд╢реБрд░реВ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рдпрдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбрд┐рд╕рдХреНрд▓реЗрдорд░ рдкрдврд╝реЗрдВ.
рдЗрд╕ рдХреЛрдбрд▓реИрдм рдореЗрдВ рдмрд╛рдж рдореЗрдВ, рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рдпрдо рдЬреЛрдбрд╝реЗ рдЬрд╛рдПрдВрдЧреЗ. рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдирд┐рдпрдо рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддреМрд░ рдкрд░ рдХрд┐рд╕реА рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбрд┐рд╕реНрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдпрд╛ рдЙрдкрд▓рдмреНрдз рди рдХрд░реЗрдВ. - рдмрдирд╛рдПрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
Firebase рдХреЗ рд▓рд┐рдП Cloud Storage рд╕реЗрдЯ рдЕрдк рдХрд░рдирд╛
рдпрд╣ рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди, Cloud Storage for Firebase рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рдлрд╝реЛрдЯреЛ рдХреЛ рд╕реЗрд╡, рдЕрдкрд▓реЛрдб, рдФрд░ рд╢реЗрдпрд░ рдХрд░рддрд╛ рд╣реИ.
рдЕрдкрдиреЗ Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, Cloud Storage for Firebase рдХреЛ рд╕реЗрдЯ рдЕрдк рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- Firebase рдХрдВрд╕реЛрд▓ рдХреЗ рдмрд╛рдПрдВ рдкреИрдирд▓ рдореЗрдВ, Build рдХреЛ рдмрдбрд╝рд╛ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, Storage рдХреЛ рдЪреБрдиреЗрдВ.
- рд╢реБрд░реВ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
- рдЕрдкрдиреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдЯреЛрд░реЗрдЬ рдмрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬрдЧрд╣ рдЪреБрдиреЗрдВ.
US-WEST1
,US-CENTRAL1
, рдФрд░US-EAST1
рдореЗрдВ рдореМрдЬреВрдж рдмрдХреЗрдЯ, Google Cloud Storage рдХреЗ рд▓рд┐рдП "рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдореБрдлрд╝реНрдд" рдЯрд┐рдпрд░ рдХрд╛ рдлрд╝рд╛рдпрджрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ. рдЕрдиреНрдп рд╕рднреА рдЬрдЧрд╣реЛрдВ рдкрд░ рдореМрдЬреВрдж рдмрдХреЗрдЯ рдХреЗ рд▓рд┐рдП, Google Cloud Storage рдХреА рдХреАрдордд рдФрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╕реЗ рдЬреБрдбрд╝реЗ рдирд┐рдпрдо рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ. - рдЯреЗрд╕реНрдЯ рдореЛрдб рдореЗрдВ рд╢реБрд░реВ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рдпрдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбрд┐рд╕рдХреНрд▓реЗрдорд░ рдкрдврд╝реЗрдВ.
рдЗрд╕ рдХреЛрдбрд▓реИрдм рдореЗрдВ рдмрд╛рдж рдореЗрдВ, рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рдпрдо рдЬреЛрдбрд╝реЗ рдЬрд╛рдПрдВрдЧреЗ. рдЕрдкрдиреЗ рд╕реНрдЯреЛрд░реЗрдЬ рдмрдХреЗрдЯ рдХреЗ рд▓рд┐рдП, рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдирд┐рдпрдо рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддреМрд░ рдкрд░ рдХрд┐рд╕реА рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбрд┐рд╕реНрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдпрд╛ рдЙрдкрд▓рдмреНрдз рди рдХрд░реЗрдВ. - рдмрдирд╛рдПрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
4. Firebase рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛
Firebase рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рд╕реАрдПрд▓рдЖрдИ) рдХреА рдорджрдж рд╕реЗ, Firebase рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реНрдерд╛рдиреАрдп рддреМрд░ рдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рд╕рд╛рде рд╣реА, рдЕрдкрдиреЗ рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.
- рд╕реАрдПрд▓рдЖрдИ рдХреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ npm рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:
npm -g install firebase-tools@latest
- рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рд╕реАрдПрд▓рдЖрдИ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдЗрд╕рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:
firebase --version
рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ Firebase CLI рдХрд╛ рд╡рд░реНрд╢рди v13.9.0 рдпрд╛ рдЙрд╕рдХреЗ рдмрд╛рдж рдХрд╛ рд╣реЛ.
- рдпрд╣рд╛рдВ рджреА рдЧрдИ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдХрд░, Firebase CLI рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдВ:
firebase login
рдЖрдкрдиреЗ рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЯреЗрдВрдкреНрд▓реЗрдЯ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗрдЯ рдЕрдк рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╡рд╣ Firebase Hosting рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЖрдкрдХреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд▓реЛрдХрд▓ рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА рд╕реЗ рдкреБрд▓ рдХрд░реЗ. рдпрд╣ рд╡рд╣реА рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдХреЛрдбрд▓реИрдм рдореЗрдВ рдкрд╣рд▓реЗ рдХреНрд▓реЛрди рдХрд┐рдпрд╛ рдерд╛. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкреБрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛.
- рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреА рдХрдорд╛рдВрдб рд▓рд╛рдЗрди, рдЖрдкрдХреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд▓реЛрдХрд▓
angularfire-start
рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА рдХреЛ рдРрдХреНрд╕реЗрд╕ рдХрд░ рд░рд╣реА рд╣реЛ. - рдЕрдкрдиреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:
firebase use --add
- рдЬрдм рдХрд╣рд╛ рдЬрд╛рдП, рддрдм рдЕрдкрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЖрдИрдбреА рдЪреБрдиреЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЕрдкрдиреЗ Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХреЛрдИ рджреВрд╕рд░рд╛ рдирд╛рдо рджреЗрдВ.
рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ (рдкреНрд░реЛрдбрдХреНрд╢рди, рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рд╡рдЧреИрд░рд╣) рд╣реИрдВ, рддреЛ рдПрд▓рд┐рдпрд╛рд╕ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдлрд╝рд╛рдпрджреЗрдордВрдж рд╣реЛрддрд╛ рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдХреЛрдбрд▓реИрдм рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд┐рд░реНрдлрд╝ default
рдХреЗ рдПрд▓рд┐рдпрд╛рд╕ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВрдЧреЗ.
- рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рджрд┐рдП рдЧрдП рдмрд╛рдХреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ.
5. AngularFire рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ Angular CLI рдФрд░ AngularFire рд╕реЗрдЯ рдЕрдк рдХрд░ рд▓рд┐рдпрд╛ рд╣реЛ.
- рдХрдВрд╕реЛрд▓ рдореЗрдВ, рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:
npm install -g @angular/cli
- рдЗрд╕рдХреЗ рдмрд╛рдж,
angularfire-start
рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА рдХреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ, Angular CLI рдХрд╛ рдпрд╣ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:
ng add @angular/fire
рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЬрд╝рд░реВрд░реА рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреА.
- рдЬрдм рдХрд╣рд╛ рдЬрд╛рдП, рддрдм рд╕реНрдкреЗрд╕ рдмрд╛рд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ
ng deploy -- hosting
рд╕реЗ рд╕рд╣реА рдХрд╛ рдирд┐рд╢рд╛рди рд╣рдЯрд╛рдПрдВ. рдРрд░реЛ рдмрдЯрди рдФрд░ рд╕реНрдкреЗрд╕ рдмрд╛рд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдпреЗ рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдЪреБрдиреЗрдВ:Authentication
Firestore
Cloud Messaging
Cloud Storage
enter
рджрдмрд╛рдПрдВ рдФрд░ рдмрд╛рдХреА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ.- "Install AngularFire" рдореИрд╕реЗрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдорд┐рдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдЕрдкрдиреА GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ рдкреБрд╢ рдХрд░реЗрдВ.
6. рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдХрдПрдВрдб рдмрдирд╛рдирд╛
рдЗрд╕ рд╕реЗрдХреНрд╢рди рдореЗрдВ, рдЖрдкрдХреЛ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рдмреИрдХрдПрдВрдб рд╕реЗрдЯ рдЕрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдЕрдкрдиреА Git рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдХреА рдХрд┐рд╕реА рдмреНрд░рд╛рдВрдЪ рдХреЛ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХреЗ.
рдЗрд╕ рд╕реЗрдХреНрд╢рди рдХреЗ рдЖрдЦрд┐рд░ рддрдХ, рдЖрдкрдХреЗ рдкрд╛рд╕ GitHub рдореЗрдВ рдореМрдЬреВрдж рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ App Hosting рдмреИрдХрдПрдВрдб рд╣реЛрдЧрд╛. рдЬрдм рднреА main
рдмреНрд░рд╛рдВрдЪ рдореЗрдВ рдХреЛрдИ рдирдпрд╛ рдХрдорд┐рдЯ рдкреБрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддрдм рдпрд╣ рдмреИрдХрдПрдВрдб рдЖрдкрдХреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдирдП рд╡рд░реНрд╢рди рдХреЛ рдЕрдкрдиреЗ-рдЖрдк рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдПрдЧрд╛ рдФрд░ рд░реЛрд▓ рдЖрдЙрдЯ рдХрд░реЗрдЧрд╛.
- Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ App Hosting рдкреЗрдЬ рдкрд░ рдЬрд╛рдПрдВ:
- рдмреИрдХрдПрдВрдб рдмрдирд╛рдиреЗ рдХреА рдкреНрд░реЛрд╕реЗрд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, "рд╢реБрд░реВ рдХрд░реЗрдВ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдЕрдкрдиреЗ рдмреИрдХрдПрдВрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:
- рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ, рдкрд╣рд▓реЗ рдмрдирд╛рдИ рдЧрдИ GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ.
- рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рд╕реЗрдЯрд┐рдВрдЧ рд╕реЗрдЯ рдХрд░реЗрдВ:
- рд░реВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА рдХреЛ
/
рдХреЗ рддреМрд░ рдкрд░ рд╕реЗрд╡ рдХрд░реЗрдВ - рд▓рд╛рдЗрд╡ рдмреНрд░рд╛рдВрдЪ рдХреЛ
main
рдкрд░ рд╕реЗрдЯ рдХрд░реЛ - рдЕрдкрдиреЗ-рдЖрдк рд░реЛрд▓ рдЖрдЙрдЯ рд╣реЛрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдЪрд╛рд▓реВ рдХрд░рдирд╛
- рд░реВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА рдХреЛ
- рдЕрдкрдиреЗ рдмреИрдХрдПрдВрдб
friendlychat-codelab
рдХреЛ рдирд╛рдо рджреЗрдВ. - "Firebase рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ рдпрд╛ рдЙрд╕реЗ рдЬреЛрдбрд╝реЗрдВ" рдореЗрдВ рдЬрд╛рдХрд░, "рдореМрдЬреВрджрд╛ Firebase рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЪреБрдиреЗрдВ" рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реЗ, рд╡рд╣ рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЪреБрдиреЗрдВ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдерд╛.
- "рдкреВрд░рд╛ рдХрд░реЗрдВ рдФрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдЖрдкрдХреЛ рдПрдХ рдирдП рдкреЗрдЬ рдкрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛. рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдирдП рдмреИрдХрдПрдВрдб рдХрд╛ рд╕реНрдЯреЗрдЯрд╕ рджрд┐рдЦреЗрдЧрд╛!
- рд░реЛрд▓рдЖрдЙрдЯ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, "рдбреЛрдореЗрди" рдореЗрдВ рдЬрд╛рдХрд░ рдЕрдкрдиреЗ рдореБрдлрд╝реНрдд рдбреЛрдореЗрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдбреАрдПрдирдПрд╕ рдкреНрд░реЛрдкрдЧреЗрд╢рди рдХреА рд╡рдЬрд╣ рд╕реЗ, рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рдорд┐рдирдЯ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВ.
рдЖрдкрдиреЗ рд╢реБрд░реБрдЖрддреА рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбрд┐рдкреНрд▓реЙрдп рдХрд░ рджрд┐рдпрд╛ рд╣реИ! рдЬрдм рднреА GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдХреА main
рдмреНрд░рд╛рдВрдЪ рдореЗрдВ рдХреЛрдИ рдирдИ рдХрдорд┐рдЯ рдкреБрд╢ рдХреА рдЬрд╛рдПрдЧреА, рддрдм рдЖрдкрдХреЛ Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ рдПрдХ рдирдпрд╛ рдмрд┐рд▓реНрдб рдФрд░ рд░реЛрд▓рдЖрдЙрдЯ рд╢реБрд░реВ рд╣реЛрддрд╛ рджрд┐рдЦреЗрдЧрд╛. рд╕рд╛рде рд╣реА, рд░реЛрд▓рдЖрдЙрдЯ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдЕрдкрдиреЗ-рдЖрдк рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧреА.
рдЖрдкрдХреЛ FriendlyChat рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕рд╛рдЗрди-рдЗрди рд╕реНрдХреНрд░реАрди рджрд┐рдЦреЗрдЧреА. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЕрднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реА рд╣реИ.
рдлрд╝рд┐рд▓рд╣рд╛рд▓, рдпрд╣ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдХреА рдорджрдж рд╕реЗ рдпрд╣ рдЬрд▓реНрдж рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧреЗрдЧрд╛!
рдЕрдм рд╣рдо рд░реАрдпрд▓-рдЯрд╛рдЗрдо рдЪреИрдЯ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВрдЧреЗ.
7. Firebase рдХреЛ рдЗрдВрдкреЛрд░реНрдЯ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
Firebase рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛
рдЖрдкрдХреЛ Firebase SDK рдЯреВрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдЙрд╕реЗ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ рдХреМрдирд╕реЗ Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ.
- Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧ рдкрд░ рдЬрд╛рдПрдВ
- "рдЖрдкрдХреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди" рдХрд╛рд░реНрдб рдореЗрдВ, рдЙрд╕ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдирд┐рдХрдиреЗрдо рдЪреБрдиреЗрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ.
- Firebase SDK рд╕реНрдирд┐рдкреЗрдЯ рдкреИрдирд▓ рдореЗрдВ рдЬрд╛рдХрд░, "Config" рдЪреБрдиреЗрдВ.
рдЖрдкрдХреЛ рджрд┐рдЦреЗрдЧрд╛ рдХрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдПрдирд╡рд╛рдпрд░рдореЗрдВрдЯ рдлрд╝рд╛рдЗрд▓ /angularfire-start/src/environments/environment.ts
рдЬрдирд░реЗрдЯ рдХреА рдЧрдИ рд╣реИ.
- рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ
angularfire-start/src/firebase-config.js
рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ.
environment.ts
export const environment = {
firebase: {
apiKey: "API_KEY",
authDomain: "PROJECT_ID.firebaseapp.com",
projectId: "PROJECT_ID",
storageBucket: "PROJECT_ID.firebasestorage.app",
messagingSenderId: "SENDER_ID",
appId: "APP_ID",
},
};
AngularFire рд╕реЗрдЯрдЕрдк рджреЗрдЦреЗрдВ
рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЪреБрдиреА рдЧрдИ рд╕реБрд╡рд┐рдзрд╛рдПрдВ, /angularfire-start/src/app/app.config.ts
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдкрдиреЗ-рдЖрдк рдЬреБрдбрд╝ рдЧрдИ рд╣реИрдВ. рдЗрд╕рд╕реЗ рдЖрдкрдХрд╛ рдРрдкреНрд▓рд┐рдХреЗрд╢рди, Firebase рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рдкрд╛рддрд╛ рд╣реИ.
8. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рдЗрди-рдЗрди рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рд╕реЗрдЯ рдЕрдк рдХрд░рдирд╛
AngularFire рдХреЛ app.config.ts
рдореЗрдВ рдЗрдВрдкреЛрд░реНрдЯ рдФрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдЗрд╕рд▓рд┐рдП, рдЕрдм рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдЕрдм рдЖрдкрдХреЛ Firebase Authentication рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рдЗрди-рдЗрди рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рд▓рд╛рдЧреВ рдХрд░рдиреА рд╣реИ.
рдЕрдиреБрдорддрд┐ рд╡рд╛рд▓рд╛ рдбреЛрдореЗрди рдЬреЛрдбрд╝рдирд╛
Firebase Authentication, рд╕рд┐рд░реНрдлрд╝ рдЙрди рдбреЛрдореЗрди рд╕реЗ рд╕рд╛рдЗрди-рдЗрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдиреЗ рдХрдВрдЯреНрд░реЛрд▓ рдХрд┐рдпрд╛ рд╣реИ. рдбреЛрдореЗрди рдХреА рд╕реВрдЪреА рдореЗрдВ, рдореБрдлрд╝реНрдд рдореЗрдВ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдбреЛрдореЗрди рдЬреЛрдбрд╝реЗрдВ:
- рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдкрд░ рдЬрд╛рдПрдВ.
- рдЕрдкрдиреЗ рдмреИрдХрдПрдВрдб рдХрд╛ рдбреЛрдореЗрди рдХреЙрдкреА рдХрд░реЗрдВ.
- рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдкрд░ рдЬрд╛рдПрдВ.
- рдЕрдиреБрдорддрд┐ рдкрд╛ рдЪреБрдХреЗ рдбреЛрдореЗрди рдЯреИрдм рдХреЛ рдЪреБрдиреЗрдВ.
- рдбреЛрдореЗрди рдЬреЛрдбрд╝реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ App Hosting рдХреЗ рдмреИрдХрдПрдВрдб рдХрд╛ рдбреЛрдореЗрди рдЪрд┐рдкрдХрд╛рдПрдВ.
Google рд╕рд╛рдЗрди-рдЗрди рдХреА рдорджрдж рд╕реЗ, рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛
рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ Google рд╕реЗ рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ login
рдлрд╝рдВрдХреНрд╢рди рдЯреНрд░рд┐рдЧрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ. рдЗрд╕ рдХреЛрдбрд▓реИрдм рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Firebase рдХреЛ Google рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдЖрдЗрдбреЗрдВрдЯрд┐рдЯреА рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдХреЗ рддреМрд░ рдкрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рд╣реЛрдЧреА. рдЖрдкрдХреЛ рдкреЙрдк-рдЕрдк рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛. рд╣рд╛рд▓рд╛рдВрдХрд┐, Firebase рдореЗрдВ рдХрдИ рдЕрдиреНрдп рддрд░реАрдХреЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ.
- рд╕рдмрдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реА
/src/app/services/
рдореЗрдВ рдЬрд╛рдХрд░,chat.service.ts
рдЦреЛрд▓реЗрдВ. login
рдлрд╝рдВрдХреНрд╢рди рдвреВрдВрдвреЗрдВ.- рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЬрдЧрд╣ рдЗрд╕ рдХреЛрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ.
chat.service.ts
// Signs-in Friendly Chat.
login() {
signInWithPopup(this.auth, this.provider).then((result) => {
const credential = GoogleAuthProvider.credentialFromResult(result);
this.router.navigate(['/', 'chat']);
return credential;
})
}
рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ Log out рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддрдм logout
рдлрд╝рдВрдХреНрд╢рди рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддрд╛ рд╣реИ.
- рдлрд╝рд╛рдЗрд▓
src/app/services/chat.service.ts
рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ. logout
рдлрд╝рдВрдХреНрд╢рди рдвреВрдВрдвреЗрдВ.- рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЬрдЧрд╣ рдЗрд╕ рдХреЛрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ.
chat.service.ts
// Logout of Friendly Chat.
logout() {
signOut(this.auth).then(() => {
this.router.navigate(['/', 'login'])
console.log('signed out');
}).catch((error) => {
console.log('sign out error: ' + error);
})
}
рдкреБрд╖реНрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛
рдЗрд╕рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд▓реЙрдЧ рдЗрди рдХрд┐рдпрд╛ рд╣реИ рдпрд╛ рд▓реЙрдЧ рдЖрдЙрдЯ рдХрд┐рдпрд╛ рд╣реИ. AngularFire, рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдПрдХ рдРрд╕рд╛ рдСрдмреНрдЬрд╝рд░реНрд╡реЗрдмрд▓ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдкреБрд╖реНрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрдиреЗ рдкрд░ рдЕрдкрдбреЗрдЯ рд╣реЛрддрд╛ рд╣реИ. рдпрд╣ рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рджреЗрдЦ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП.
- рдлрд╝рд╛рдЗрд▓
src/app/services/chat.service.ts
рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ. - рд╡реИрд░рд┐рдПрдмрд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ
user$
рдвреВрдВрдвреЗрдВ.
chat.service.ts
// observable that is updated when the auth state changes
user$ = user(this.auth);
рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб, AngularFire рдлрд╝рдВрдХреНрд╢рди user
рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ. рдпрд╣ рдлрд╝рдВрдХреНрд╢рди, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдСрдмреНрдЬрд╝рд░реНрд╡реЗрдмрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рджрд┐рдЦрд╛рддрд╛ рд╣реИ. рдпрд╣ рд╣рд░ рдмрд╛рд░ рддрдм рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдЧрд╛, рдЬрдм рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓реЗрдЧреА. рдЬреИрд╕реЗ, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╛рдЗрди рдЗрди рдпрд╛ рд╕рд╛рдЗрди рдЖрдЙрдЯ рдХрд░реЗрдЧрд╛. FriendlyChat рдореЗрдВ Angular рдЯреЗрдВрдкреНрд▓реЗрдЯ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ, рдЗрд╕ рдСрдмреНрдЬрд╝рд░реНрд╡реЗрдмрд▓ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ. рдЬреИрд╕реЗ, рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рдирд╛, рд╣реЗрдбрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдирд╛ рд╡рдЧреИрд░рд╣.
рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЯреЗрд╕реНрдЯ рдХрд░рдирд╛
- "Adding Google Authentication" рдореИрд╕реЗрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдорд┐рдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдЕрдкрдиреА GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ рдкреБрд╢ рдХрд░реЗрдВ.
- Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ App Hosting рдкреЗрдЬ рдЦреЛрд▓реЗрдВ рдФрд░ рдирдП рд░реЛрд▓рдЖрдЙрдЯ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░реЗрдВ.
- рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдкреЗрдЬ рдХреЛ рд░реАрдлрд╝реНрд░реЗрд╢ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, 'рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВ' рдмрдЯрди рдФрд░ рдЕрдкрдиреЗ Google рдЦрд╛рддреЗ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ. рдЕрдЧрд░ рдЖрдкрдХреЛ
auth/operation-not-allowed
рд╡рд╛рд▓рд╛ рдХреЛрдИ рдЧрдбрд╝рдмрдбрд╝реА рдХрд╛ рдореИрд╕реЗрдЬ рджрд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдиреЗ Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ, Google рд╕рд╛рдЗрди-рдЗрди рдХреЛ рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛ рдХреЗ рддреМрд░ рдкрд░ рдЪрд╛рд▓реВ рдХрд┐рдпрд╛ рд╣реЛ. - рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЕрдкрдиреА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдлрд╝реЛрдЯреЛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
9. Cloud Firestore рдореЗрдВ рдореИрд╕реЗрдЬ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ
рдЗрд╕ рд╕реЗрдХреНрд╢рди рдореЗрдВ, рдЖрдкрдХреЛ Cloud Firestore рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ. рдЗрд╕реЗ Firebase рдХрдВрд╕реЛрд▓ рдХреА рдорджрдж рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, Cloud Firestore рдореЗрдВ рдбреЗрдЯрд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╕реБрд╡рд┐рдзрд╛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛.
рдбреЗрдЯрд╛ рдореЙрдбрд▓
Cloud Firestore рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдХрд▓реЗрдХреНрд╢рди, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝, рдлрд╝реАрд▓реНрдб, рдФрд░ рд╕рдм-рдХрд▓реЗрдХреНрд╢рди рдореЗрдВ рдмрд╛рдВрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ. рдЪреИрдЯ рдХреЗ рд╣рд░ рдореИрд╕реЗрдЬ рдХреЛ, messages
рдирд╛рдо рдХреЗ рдЯреЙрдк-рд▓реЗрд╡рд▓ рдХрд▓реЗрдХреНрд╢рди рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рддреМрд░ рдкрд░ рд╕реЗрд╡ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛.
Cloud Firestore рдореЗрдВ рдореИрд╕реЗрдЬ рдЬреЛрдбрд╝рдирд╛
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдЦреЗ рдЧрдП рдЪреИрдЯ рдореИрд╕реЗрдЬ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Cloud Firestore рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛.
рдЗрд╕ рд╕реЗрдХреНрд╢рди рдореЗрдВ, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝рдиреА рд╣реЛрдЧреА рдЬрд┐рд╕рд╕реЗ рд╡реЗ рдЖрдкрдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдирдП рдореИрд╕реЗрдЬ рд▓рд┐рдЦ рд╕рдХреЗрдВ. рднреЗрдЬреЗрдВ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ, рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдЯреНрд░рд┐рдЧрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛. рдпрд╣ messages
рдХрд▓реЗрдХреНрд╢рди рдореЗрдВ рдореМрдЬреВрдж рдЖрдкрдХреЗ Cloud Firestore рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдВ, рдореИрд╕реЗрдЬ рдлрд╝реАрд▓реНрдб рдХреЗ рдХреЙрдиреНрдЯреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдореИрд╕реЗрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝рддрд╛ рд╣реИ. add()
рддрд░реАрдХреЗ рд╕реЗ, рдХрд▓реЗрдХреНрд╢рди рдореЗрдВ рдПрдХ рдирдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ. рдЗрд╕рдХрд╛ рдЖрдИрдбреА рдЕрдкрдиреЗ-рдЖрдк рдЬрдирд░реЗрдЯ рд╣реЛрддрд╛ рд╣реИ.
- рдлрд╝рд╛рдЗрд▓
src/app/services/chat.service.ts
рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ. addMessage
рдлрд╝рдВрдХреНрд╢рди рдвреВрдВрдвреЗрдВ.- рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЬрдЧрд╣ рдЗрд╕ рдХреЛрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ.
chat.service.ts
// Adds a text or image message to Cloud Firestore.
addMessage = async (
textMessage: string | null,
imageUrl: string | null,
): Promise<void | DocumentReference<DocumentData>> => {
// ignore empty messages
if (!textMessage && !imageUrl) {
console.log(
"addMessage was called without a message",
textMessage,
imageUrl,
);
return;
}
if (this.currentUser === null) {
console.log("addMessage requires a signed-in user");
return;
}
const message: ChatMessage = {
name: this.currentUser.displayName,
profilePicUrl: this.currentUser.photoURL,
timestamp: serverTimestamp(),
uid: this.currentUser?.uid,
};
textMessage && (message.text = textMessage);
imageUrl && (message.imageUrl = imageUrl);
try {
const newMessageRef = await addDoc(
collection(this.firestore, "messages"),
message,
);
return newMessageRef;
} catch (error) {
console.error("Error writing new message to Firebase Database", error);
return;
}
};
рдореИрд╕реЗрдЬ рднреЗрдЬрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛
- "Post new chats to Firestore" рдореИрд╕реЗрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдорд┐рдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдЕрдкрдиреА GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ рдкреБрд╢ рдХрд░реЗрдВ.
- Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ App Hosting рдкреЗрдЬ рдЦреЛрд▓реЗрдВ рдФрд░ рдирдП рд░реЛрд▓рдЖрдЙрдЯ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░реЗрдВ.
- FriendlyChat рдХреЛ рд░реАрдлрд╝реНрд░реЗрд╢ рдХрд░реЗрдВ. рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, "рдирдорд╕реНрддреЗ!" рдЬреИрд╕рд╛ рдХреЛрдИ рдореИрд╕реЗрдЬ рдбрд╛рд▓реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рднреЗрдЬреЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдЗрд╕рд╕реЗ рдореИрд╕реЗрдЬ рдХреЛ Cloud Firestore рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЕрднреА рдбреЗрдЯрд╛ рдирд╣реАрдВ рджрд┐рдЦреЗрдЧрд╛. рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЕрдм рднреА рдбреЗрдЯрд╛ рдлрд┐рд░ рд╕реЗ рдкрд╛рдирд╛ рд╣реЛрдЧрд╛. рдпрд╣ рдХреЛрдбрд▓реИрдм рдХрд╛ рдЕрдЧрд▓рд╛ рд╕реЗрдХреНрд╢рди рд╣реИ.
- рдЖрдкрдХреЛ Firebase Console рдореЗрдВ, рдирдпрд╛ рдореИрд╕реЗрдЬ рджрд┐рдЦреЗрдЧрд╛. Emulator Suite рдХрд╛ рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЦреЛрд▓реЗрдВ. рдмрдирд╛рдПрдВ рд╕реЗрдХреНрд╢рди рдореЗрдВ рдЬрд╛рдХрд░, Firestore рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдВ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рднреА Firestore рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ messages рдХрд▓реЗрдХреНрд╢рди рдореЗрдВ, рдирдпрд╛ рдореИрд╕реЗрдЬ рджрд┐рдЦреЗрдЧрд╛:
10. рдореИрд╕реЗрдЬ рдкрдврд╝рдирд╛
рдореИрд╕реЗрдЬ рд╕рд┐рдВрдХ рдХрд░рдирд╛
рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдореИрд╕реЗрдЬ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдРрд╕рд╛ рдСрдмреНрдЬрд╝рд░реНрд╡реЗрдмрд▓ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдбреЗрдЯрд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрдиреЗ рдкрд░ рдЯреНрд░рд┐рдЧрд░ рд╣реЛ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдРрд╕рд╛ рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рдПрд▓рд┐рдореЗрдВрдЯ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдирдП рдореИрд╕реЗрдЬ рджрд┐рдЦрд╛рдП.
рдЖрдкрдХреЛ рдРрд╕рд╛ рдХреЛрдб рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдЬреЛрдбрд╝реЗ рдЧрдП рдирдП рдореИрд╕реЗрдЬ рдХреЛ рд╕реБрдиреЗ. рдЗрд╕ рдХреЛрдб рдореЗрдВ, рдЖрдкрдХреЛ messages
рдХрд▓реЗрдХреНрд╢рди рдХрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рд╡рд╛рдкрд╕ рдкрд╛рдирд╛ рд╣реЛрдЧрд╛. рд▓реЛрдб рд╣реЛрдиреЗ рдкрд░, рдмрд╣реБрдд рд▓рдВрдмрд╛ рдЗрддрд┐рд╣рд╛рд╕ рди рджрд┐рдЦреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЪреИрдЯ рдХреЗ рд╕рд┐рд░реНрдлрд╝ рдкрд┐рдЫрд▓реЗ 12 рдореИрд╕реЗрдЬ рджрд┐рдЦрд╛рдПрдВрдЧреЗ.
- рдлрд╝рд╛рдЗрд▓
src/app/services/chat.service.ts
рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ. loadMessages
рдлрд╝рдВрдХреНрд╢рди рдвреВрдВрдвреЗрдВ.- рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЬрдЧрд╣ рдЗрд╕ рдХреЛрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ.
chat.service.ts
// Loads chat message history and listens for upcoming ones.
loadMessages = () => {
// Create the query to load the last 12 messages and listen for new ones.
const recentMessagesQuery = query(collection(this.firestore, 'messages'), orderBy('timestamp', 'desc'), limit(12));
// Start listening to the query.
return collectionData(recentMessagesQuery);
}
рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдореМрдЬреВрдж рдореИрд╕реЗрдЬ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдХрд▓реЗрдХреНрд╢рди рдкрд░ рдХреНрд╡реЗрд░реА рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ. рдЗрд╕рдХреЗ рд▓рд┐рдП, collection
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ. рдЗрд╕рд╕реЗ рдпрд╣ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕ рдХрд▓реЗрдХреНрд╢рди рдХрд╛ рдбреЗрдЯрд╛ рд╕реБрдирдирд╛ рд╣реИ. рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ, messages
рдХрд▓реЗрдХреНрд╢рди рдореЗрдВ рд╣реБрдП рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рд╕реБрдирд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ. рдЗрд╕реА рдХрд▓реЗрдХреНрд╢рди рдореЗрдВ рдЪреИрдЯ рдореИрд╕реЗрдЬ рд╕реЗрд╡ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ. рдЖрдкрдиреЗ limit(12)
рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рд╕рд┐рд░реНрдлрд╝ рдкрд┐рдЫрд▓реЗ 12 рдореИрд╕реЗрдЬ рд╕реБрдирдиреЗ рдХреА рд╕реАрдорд╛ рднреА рд▓рд╛рдЧреВ рдХреА рд╣реИ. рд╕рд╛рде рд╣реА, orderBy('timestamp', 'desc')
рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдореИрд╕реЗрдЬ рдХреЛ рддрд╛рд░реАрдЦ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдХреНрд░рдо рдореЗрдВ рд▓рдЧрд╛рдпрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрдкрдХреЛ 12 рдирдП рдореИрд╕реЗрдЬ рдорд┐рд▓ рд╕рдХреЗрдВ.
collectionData
рдлрд╝рдВрдХреНрд╢рди, рд╕реНрдиреИрдкрд╢реЙрдЯ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ. рдХреНрд╡реЗрд░реА рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдХреЛрдИ рднреА рдмрджрд▓рд╛рд╡ рд╣реЛрдиреЗ рдкрд░, рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдЯреНрд░рд┐рдЧрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛. рдРрд╕рд╛ рддрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рдХреЛрдИ рдореИрд╕реЗрдЬ рдорд┐рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдЙрд╕рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ рдпрд╛ рдЙрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реЛ. рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╝реНрдпрд╛рджрд╛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, Cloud Firestore рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрдврд╝реЗрдВ.
рдореИрд╕реЗрдЬ рд╕рд┐рдВрдХ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЖрдЬрд╝рдорд╛рдирд╛
- "Show new chats in the UI" рдореИрд╕реЗрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдорд┐рдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдЕрдкрдиреА GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ рдкреБрд╢ рдХрд░реЗрдВ.
- Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ App Hosting рдкреЗрдЬ рдЦреЛрд▓реЗрдВ рдФрд░ рдирдП рд░реЛрд▓рдЖрдЙрдЯ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░реЗрдВ.
- FriendlyChat рдХреЛ рд░реАрдлрд╝реНрд░реЗрд╢ рдХрд░реЗрдВ. рдЖрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд╣рд▓реЗ рдЬреЛ рдореИрд╕реЗрдЬ рдмрдирд╛рдП рдереЗ рд╡реЗ FriendlyChat рдХреЗ рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рдореЗрдВ рджрд┐рдЦрдиреЗ рдЪрд╛рд╣рд┐рдП. рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ. рдирдП рдореИрд╕реЗрдЬ рд▓рд┐рдЦреЗрдВ. рд╡реЗ рддреБрд░рдВрдд рджрд┐рдЦрдиреЗ рдЪрд╛рд╣рд┐рдП.
- (рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ) Emulator Suite рдХреЗ Firestore рд╕реЗрдХреНрд╢рди рдореЗрдВ рдЬрд╛рдХрд░, рдореИрдиреНрдпреБрдЕрд▓ рддрд░реАрдХреЗ рд╕реЗ рдирдП рдореИрд╕реЗрдЬ рдЬреЛрдбрд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ. рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореМрдЬреВрджрд╛ рдореИрд╕реЗрдЬ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдорд┐рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдХрд┐рдП рдЧрдП рд╕рднреА рдмрджрд▓рд╛рд╡, рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рдореЗрдВ рджрд┐рдЦрдиреЗ рдЪрд╛рд╣рд┐рдП.
рдмрдзрд╛рдИ рд╣реЛ! рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ Cloud Firestore рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрдврд╝реЗ рд╣реИрдВ!
11. рдПрдЖрдИ рдХреА рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдЬреЛрдбрд╝рдирд╛
рдЪреИрдЯ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдорджрджрдЧрд╛рд░ рд╕реБрд╡рд┐рдзрд╛рдПрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, Google рдХреЗ рдПрдЖрдИ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛.
Google AI API рдкрд╛рд╕рдХреЛрдб рдкрд╛рдирд╛
- Google AI Studio рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдПрдкреАрдЖрдИ рдкрд╛рд╕рдХреЛрдб рдмрдирд╛рдПрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
- рдЗрд╕ рдХреЛрдбрд▓реИрдм рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪреБрдиреЗрдВ. рдпрд╣ рдкреНрд░реЙрдореНрдкреНрдЯ, Google Cloud рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рд░ Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдПрдХ Google Cloud рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ.
- рдореМрдЬреВрджрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдкреАрдЖрдИ рдкрд╛рд╕рдХреЛрдб рдмрдирд╛рдПрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
- рдорд┐рд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреАрдЖрдИ рдкрд╛рд╕рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛
рдпрд╣ рдПрдХреНрд╕рдЯреЗрдВрд╢рди, рдПрдХ Cloud рдлрд╝рдВрдХреНрд╢рди рдбрд┐рдкреНрд▓реЙрдп рдХрд░реЗрдЧрд╛. рдпрд╣ рдлрд╝рдВрдХреНрд╢рди, Firestore рдореЗрдВ messages
рдХрд▓реЗрдХреНрд╢рди рдореЗрдВ рдХреЛрдИ рдирдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рдкрд░ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдЧрд╛. рдпрд╣ рдлрд╝рдВрдХреНрд╢рди, Gemini рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдореМрдЬреВрдж response
рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рд▓рд┐рдЦреЗрдЧрд╛.
- Gemini API рдХреА рдорджрдж рд╕реЗ рдЪреИрдЯрдмреЙрдЯ рдмрдирд╛рдПрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреЗрдЬ рдкрд░, Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
- рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ. рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ рдЪрд░рдг рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣рд╛рдВ рджреА рдЧрдИ рдкреИрд░рд╛рдореАрдЯрд░ рд╡реИрд▓реНрдпреВ рд╕реЗрдЯ рдХрд░реЗрдВ:
- Gemini API Provider:
Google AI
- Google AI API рдкрд╛рд╕рдХреЛрдб: рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдкрд╛рд╕рдХреЛрдб рдЪрд┐рдкрдХрд╛рдПрдВ рдФрд░ рд╕реАрдХреНрд░реЗрдЯ рдмрдирд╛рдПрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
- Firestore рдХрд▓реЗрдХреНрд╢рди рдХрд╛ рдкрд╛рде:
messages
- рдкреНрд░реЙрдореНрдкреНрдЯ рдлрд╝реАрд▓реНрдб:
text
- рдЬрд╡рд╛рдм рдХрд╛ рдлрд╝реАрд▓реНрдб:
response
- рдСрд░реНрдбрд░ рдлрд╝реАрд▓реНрдб:
timestamp
- рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ:
Keep your answers short, informal, and helpful. Use emojis when possible.
- Gemini API Provider:
- рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
- рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░реЗрдВ
рдПрдЖрдИ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЯреЗрд╕реНрдЯ рдХрд░реЗрдВ
FriendlyChat рдореЗрдВ, рдПрдЖрдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ рдорд┐рд▓реЗ рдЬрд╡рд╛рдмреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдб рдореМрдЬреВрдж рд╣реИ. рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдПрдХ рдирдпрд╛ рдЪреИрдЯ рдореИрд╕реЗрдЬ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛!
- FriendlyChat рдЦреЛрд▓реЗрдВ рдФрд░ рдХреЛрдИ рдореИрд╕реЗрдЬ рднреЗрдЬреЗрдВ.
- рдХреБрдЫ рджреЗрд░ рдмрд╛рдж, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдореИрд╕реЗрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдЬрд╡рд╛рдм рджрд┐рдЦреЗрдЧрд╛. рдЗрд╕рдореЗрдВ рдЖрдЦрд┐рд░ рдореЗрдВ
тЬи ai generated
рдиреЛрдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ рд╕рд╛рдлрд╝ рддреМрд░ рдкрд░ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ рдЗрд╕реЗ рдЬрдирд░реЗрдЯрд┐рд╡ рдПрдЖрдИ рдиреЗ рдмрдирд╛рдпрд╛ рд╣реИ, рди рдХрд┐ рдХрд┐рд╕реА рдЕрд╕рд▓реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ.
12. рдЗрдореЗрдЬ рднреЗрдЬрдирд╛
рдЕрдм рдЖрдкрдХреЛ рдПрдХ рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝рдиреА рд╣реИ рдЬреЛ рдЗрдореЗрдЬ рд╢реЗрдпрд░ рдХрд░рддреА рд╣реИ.
Cloud Firestore, рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдбреЗрдЯрд╛ рдХреЛ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ. рд╣рд╛рд▓рд╛рдВрдХрд┐, Cloud Storage рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ. Cloud Storage for Firebase, рдлрд╝рд╛рдЗрд▓/рдмреНрд▓реЙрдм рд╕реНрдЯреЛрд░реЗрдЬ рдХреА рд╕реЗрд╡рд╛ рд╣реИ. рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓, рд╣рдорд╛рд░реЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рд╢реЗрдпрд░ рдХреА рдЧрдИ рдХрд┐рд╕реА рднреА рдЗрдореЗрдЬ рдХреЛ рд╕реЗрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛.
рдЗрдореЗрдЬ рдХреЛ Cloud Storage рдореЗрдВ рд╕реЗрд╡ рдХрд░рдирд╛
рдЗрд╕ рдХреЛрдбрд▓реИрдм рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рдмрдЯрди рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ. рдпрд╣ рдмрдЯрди, рдлрд╝рд╛рдЗрд▓ рдкрд┐рдХрд░ рдбрд╛рдпрд▓реЙрдЧ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ. рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рдмрд╛рдж, saveImageMessage
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ. рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдЪреБрдиреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд░реЗрдлрд╝рд░рдВрд╕ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ. saveImageMessage
рдлрд╝рдВрдХреНрд╢рди рдпреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
- рдпрд╣ рдЪреИрдЯ рдлрд╝реАрдб рдореЗрдВ "рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░" рдЪреИрдЯ рдореИрд╕реЗрдЬ рдмрдирд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЗрдореЗрдЬ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ "рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ" рдРрдирд┐рдореЗрд╢рди рджрд┐рдЦреЗ.
- рдЗрд╕ рдкрд╛рде рдкрд░, Cloud Storage рдореЗрдВ рдЗрдореЗрдЬ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реИ:
/<uid>/<file_name>
- рдпрд╣ рдлрд╝рдВрдХреНрд╢рди, рдЗрдореЗрдЬ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдпреВрдЖрд░рдПрд▓ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рддреМрд░ рдкрд░ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.
- рдпрд╣ рдХреБрдХреА, рдЪреИрдЯ рдореИрд╕реЗрдЬ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреА рд╣реИ. рдЗрд╕рдореЗрдВ, рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд▓реЛрдб рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЗрдореЗрдЬ рдХреЗ рдмрдЬрд╛рдп, рдирдИ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдЗрдореЗрдЬ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдпреВрдЖрд░рдПрд▓ рд╣реЛрддрд╛ рд╣реИ.
рдЕрдм рдЗрдореЗрдЬ рднреЗрдЬрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝реЗрдВ:
- рдлрд╝рд╛рдЗрд▓
src/chat.service.ts
рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ. saveImageMessage
рдлрд╝рдВрдХреНрд╢рди рдвреВрдВрдвреЗрдВ.- рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЬрдЧрд╣ рдЗрд╕ рдХреЛрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ.
chat.service.ts
// Saves a new message containing an image in Firestore.
// This first saves the image in Firebase storage.
saveImageMessage = async(file: any) => {
try {
// 1 - Add a message with a loading icon that will get updated with the shared image.
const messageRef = await this.addMessage(null, this.LOADING_IMAGE_URL);
// 2 - Upload the image to Cloud Storage.
const filePath = `${this.auth.currentUser?.uid}/${file.name}`;
const newImageRef = ref(this.storage, filePath);
const fileSnapshot = await uploadBytesResumable(newImageRef, file);
// 3 - Generate a public URL for the file.
const publicImageUrl = await getDownloadURL(newImageRef);
// 4 - Update the chat message placeholder with the image's URL.
messageRef ?
await updateDoc(messageRef, {
imageUrl: publicImageUrl,
storageUri: fileSnapshot.metadata.fullPath
}): null;
} catch (error) {
console.error('There was an error uploading a file to Cloud Storage:', error);
}
}
рдЗрдореЗрдЬ рднреЗрдЬрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛
- "Add the ability to post images" рдореИрд╕реЗрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдорд┐рдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдЕрдкрдиреА GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ рдкреБрд╢ рдХрд░реЗрдВ.
- Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ App Hosting рдкреЗрдЬ рдЦреЛрд▓реЗрдВ рдФрд░ рдирдП рд░реЛрд▓рдЖрдЙрдЯ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░реЗрдВ.
- FriendlyChat рдХреЛ рд░реАрдлрд╝реНрд░реЗрд╢ рдХрд░реЗрдВ. рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдмрд╕реЗ рдиреАрдЪреЗ рдмрд╛рдИрдВ рдУрд░ рдореМрдЬреВрдж рдЗрдореЗрдЬ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмрдЯрди
рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдлрд╝рд╛рдЗрд▓ рдкрд┐рдХрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рдХреЛрдИ рдЗрдореЗрдЬ рдлрд╝рд╛рдЗрд▓ рдЪреБрдиреЗрдВ. рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреЛрдИ рдЗрдореЗрдЬ рдЪрд╛рд╣рд┐рдП, рддреЛ рдХреЙрдлрд╝реА рдХрдк рдХреА рдЗрд╕ рдЕрдЪреНрдЫреА рдЗрдореЗрдЬ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ.
- рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдпреВрдЬрд╝рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдпреВрдЖрдИ) рдореЗрдВ, рдЪреБрдиреА рдЧрдИ рдЗрдореЗрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдореИрд╕реЗрдЬ рджрд┐рдЦреЗрдЧрд╛:
рдЕрдЧрд░ рдЖрдкрдиреЗ рд╕рд╛рдЗрди рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрдореЗрдЬ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЧрдбрд╝рдмрдбрд╝реА рдХрд╛ рдореИрд╕реЗрдЬ рджрд┐рдЦреЗрдЧрд╛. рдЗрд╕рдореЗрдВ рдмрддрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЗрдореЗрдЬ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рд╛рдЗрди рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛.
13. рд╕реВрдЪрдирд╛рдПрдВ рджрд┐рдЦрд╛рдУ
рдЕрдм рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрддрд╛ рдЬреЛрдбрд╝рдиреА рд╣реЛрдЧреА. рдЬрдм рдЪреИрдЯ рдореЗрдВ рдирдП рдореИрд╕реЗрдЬ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рддрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕рдХреА рд╕реВрдЪрдирд╛ рджреЗрдЧрд╛. Firebase рдХреНрд▓рд╛рдЙрдб рд╕реЗ рдореИрд╕реЗрдЬ (FCM) рдПрдХ рдРрд╕рд╛ рдореИрд╕реЗрдЬрд┐рдВрдЧ рдкреНрд▓реИрдЯрдлрд╝реЙрд░реНрдо рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рднрд░реЛрд╕реЗрдордВрдж рддрд░реАрдХреЗ рд╕реЗ рдореИрд╕реЗрдЬ рдФрд░ рд╕реВрдЪрдирд╛рдПрдВ рдбрд┐рд▓реАрд╡рд░ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИ.
FCM рд╕реЗрд╡рд╛ рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рд╡рд░реНрдХрд░ рдЬреЛрдбрд╝рдирд╛
рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдПрдХ рд╕рд░реНрд╡рд┐рд╕ рд╡рд░реНрдХрд░ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИ. рдпрд╣ рд╡реЗрдм рд╕реВрдЪрдирд╛рдПрдВ рдкрд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ.
AngularFire рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рджреМрд░рд╛рди, рдореИрд╕реЗрдЬрд┐рдВрдЧ рдХреА рд╕реЗрд╡рд╛ рджреЗрдиреЗ рд╡рд╛рд▓реА рдХрдВрдкрдиреА рдХреЛ рдкрд╣рд▓реЗ рд╣реА рд╕реЗрдЯ рдЕрдк рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП. рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ /angularfire-start/src/app/app.config.ts
рдХреЗ рдЗрдВрдкреЛрд░реНрдЯ рд╕реЗрдХреНрд╢рди рдореЗрдВ рдпрд╣ рдХреЛрдб рдореМрдЬреВрдж рд╣реЛ
provideMessaging(() => {
return getMessaging();
}),
app/app.config.ts
рд╕рд░реНрд╡рд┐рд╕ рд╡рд░реНрдХрд░ рдХреЛ рд╕рд┐рд░реНрдлрд╝ Firebase Cloud Messaging SDK рдЯреВрд▓ рдХреЛ рд▓реЛрдб рдФрд░ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ. рдЗрд╕рдХреЗ рдмрд╛рдж, рд╕реВрдЪрдирд╛рдПрдВ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдХрд╛рдо рдпрд╣ SDK рдЯреВрд▓ рдЕрдкрдиреЗ-рдЖрдк рдХрд░рддрд╛ рд╣реИ.
FCM рдбрд┐рд╡рд╛рдЗрд╕ рдЯреЛрдХрди рдкрд╛рдирд╛
рдХрд┐рд╕реА рдбрд┐рд╡рд╛рдЗрд╕ рдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рд╕реВрдЪрдирд╛рдПрдВ рдкрд╛рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдкрд░, рдЖрдкрдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдЯреЛрдХрди рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛. рдЗрд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдЯреЛрдХрди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓, рдХрд┐рд╕реА рдбрд┐рд╡рд╛рдЗрд╕ рдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рд╕реВрдЪрдирд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ.
рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╛рдЗрди рдЗрди рдХрд░рддрд╛ рд╣реИ, рддрдм saveMessagingDeviceToken
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ. рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ FCM рдбрд┐рд╡рд╛рдЗрд╕ рдЯреЛрдХрди рдорд┐рд▓реЗрдЧрд╛. рдЗрд╕реЗ Cloud Firestore рдореЗрдВ рд╕реЗрд╡ рдХрд░реЗрдВ.
chat.service.ts
saveMessagingDeviceToken
рдлрд╝рдВрдХреНрд╢рди рдвреВрдВрдвреЗрдВ.- рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЬрдЧрд╣ рдЗрд╕ рдХреЛрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ.
chat.service.ts
// Saves the messaging device token to Cloud Firestore.
saveMessagingDeviceToken= async () => {
try {
const currentToken = await getToken(this.messaging);
if (currentToken) {
console.log('Got FCM device token:', currentToken);
// Saving the Device Token to Cloud Firestore.
const tokenRef = doc(this.firestore, 'fcmTokens', currentToken);
await setDoc(tokenRef, { uid: this.auth.currentUser?.uid });
// This will fire when a message is received while the app is in the foreground.
// When the app is in the background, firebase-messaging-sw.js will receive the message instead.
onMessage(this.messaging, (message) => {
console.log(
'New foreground notification from Firebase Messaging!',
message.notification
);
});
} else {
// Need to request permissions to show notifications.
this.requestNotificationsPermissions();
}
} catch(error) {
console.error('Unable to get messaging token.', error);
};
}
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХреЛрдб рд╢реБрд░реВ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛. рдЖрдкрдХреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдЯреЛрдХрди рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рддрдм рдорд┐рд▓реЗрдЧреА, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдкрдХреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реВрдЪрдирд╛рдПрдВ рджрд┐рдЦрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛. рдпрд╣ рдХреЛрдбрд▓реИрдм рдХрд╛ рдЕрдЧрд▓рд╛ рдЪрд░рдг рд╣реИ.
рд╕реВрдЪрдирд╛рдПрдВ рджрд┐рдЦрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛
рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЖрдкрдХреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реВрдЪрдирд╛рдПрдВ рджрд┐рдЦрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреА рд╣реЛрдЧреА, рддрдм рдЖрдкрдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдЯреЛрдХрди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛. рдРрд╕реЗ рдореЗрдВ, рдЖрдкрдХреЛ requestPermission()
рддрд░реАрдХреЗ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛. рдЗрд╕рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХ рдбрд╛рдпрд▓реЙрдЧ рджрд┐рдЦреЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЕрдиреБрдорддрд┐ рдорд╛рдВрдЧреА рдЬрд╛рдПрдЧреА ( рдЗрди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ).
- рдлрд╝рд╛рдЗрд▓
src/app/services/chat.service.ts
рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ. requestNotificationsPermissions
рдлрд╝рдВрдХреНрд╢рди рдвреВрдВрдвреЗрдВ.- рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЬрдЧрд╣ рдЗрд╕ рдХреЛрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ.
chat.service.ts
// Requests permissions to show notifications.
requestNotificationsPermissions = async () => {
console.log('Requesting notifications permission...');
const permission = await Notification.requestPermission();
if (permission === 'granted') {
console.log('Notification permission granted.');
// Notification permission granted.
await this.saveMessagingDeviceToken();
} else {
console.log('Unable to get permission to notify.');
}
}
рдЕрдкрдирд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдЯреЛрдХрди рдкрд╛рдирд╛
- "Add the ability to post images" рдореИрд╕реЗрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдорд┐рдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдЕрдкрдиреА GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ рдкреБрд╢ рдХрд░реЗрдВ.
- Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ App Hosting рдкреЗрдЬ рдЦреЛрд▓реЗрдВ рдФрд░ рдирдП рд░реЛрд▓рдЖрдЙрдЯ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░реЗрдВ.
- FriendlyChat рдХреЛ рд░реАрдлрд╝реНрд░реЗрд╢ рдХрд░реЗрдВ. рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕реВрдЪрдирд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рд╡рд╛рд▓рд╛ рдбрд╛рдпрд▓реЙрдЧ рдмреЙрдХреНрд╕ рджрд┐рдЦреЗрдЧрд╛:
- рдЕрдиреБрдорддрд┐ рджреЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
- рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ JavaScript рдХрдВрд╕реЛрд▓ рдЦреЛрд▓реЗрдВ. рдЖрдкрдХреЛ рдпрд╣ рдореИрд╕реЗрдЬ рджрд┐рдЦреЗрдЧрд╛:
Got FCM device token: cWL6w:APA91bHP...4jDPL_A-wPP06GJp1OuekTaTZI5K2Tu
- рдЕрдкрдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдЯреЛрдХрди рдХреЙрдкреА рдХрд░реЗрдВ. рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЬрд╝рд░реВрд░рдд рдХреЛрдбрд▓реИрдм рдХреЗ рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рдкрдбрд╝реЗрдЧреА.
рдЕрдкрдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╕реВрдЪрдирд╛ рднреЗрдЬрдирд╛
рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдЯреЛрдХрди рд╣реИ. рдЗрд╕рд▓рд┐рдП, рд╕реВрдЪрдирд╛ рднреЗрдЬреА рдЬрд╛ рд╕рдХрддреА рд╣реИ.
- Firebase рдХрдВрд╕реЛрд▓ рдХрд╛ Cloud Messaging рдЯреИрдм рдЦреЛрд▓реЗрдВ.
- "рдирдИ рд╕реВрдЪрдирд╛" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
- рд╕реВрдЪрдирд╛ рдХрд╛ рдЯрд╛рдЗрдЯрд▓ рдФрд░ рд╕реВрдЪрдирд╛ рдХрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдбрд╛рд▓реЗрдВ.
- рд╕реНрдХреНрд░реАрди рдХреЗ рджрд╛рдИрдВ рдУрд░, "рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдореИрд╕реЗрдЬ рднреЗрдЬреЗрдВ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
- рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ JavaScript рдХрдВрд╕реЛрд▓ рд╕реЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдЯреЛрдХрди рдбрд╛рд▓реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдкреНрд▓рд╕ ("+") рдХреЗ рдирд┐рд╢рд╛рди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
- "рдЬрд╛рдВрдЪ рдХрд░реЗрдВ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
рдЕрдЧрд░ рдЖрдкрдХрд╛ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝реЛрд░рдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ JavaScript рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╕реВрдЪрдирд╛ рджрд┐рдЦреЗрдЧреА.
рдЕрдЧрд░ рдЖрдкрдХрд╛ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдХ рд╕реВрдЪрдирд╛ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП. рдЬреИрд╕реЗ, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
14. Cloud Firestore рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рдпрдо
рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рдпрдо рджреЗрдЦрдирд╛
Cloud Firestore, рдРрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ, рд╕реБрд░рдХреНрд╖рд╛, рдФрд░ рдбреЗрдЯрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдпрдореЛрдВ рдХреА рднрд╛рд╖рд╛ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ.
рдЗрд╕ рдХреЛрдбрд▓реИрдм рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯ рдЕрдк рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдиреЗ рд╕реБрд░рдХреНрд╖рд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рдпрдореЛрдВ рдХреЗ рд▓рд┐рдП "рдЯреЗрд╕реНрдЯ рдореЛрдб" рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдерд╛. рдЗрд╕рд╕реЗ рдЖрдкрдиреЗ рдбреЗрдЯрд╛рд╕реНрдЯреЛрд░ рдХреЗ рдРрдХреНрд╕реЗрд╕ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛. Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ, рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗрдХреНрд╢рди рдХреЗ рдирд┐рдпрдо рдЯреИрдм рдореЗрдВ рдЬрд╛рдХрд░, рдЗрди рдирд┐рдпрдореЛрдВ рдХреЛ рджреЗрдЦрд╛ рдФрд░ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ.
рдлрд╝рд┐рд▓рд╣рд╛рд▓, рдЖрдкрдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рдпрдо рджрд┐рдЦреЗрдВрдЧреЗ. рдЗрдирд╕реЗ рдбреЗрдЯрд╛рд╕реНрдЯреЛрд░ рдХреЗ рдРрдХреНрд╕реЗрд╕ рдкрд░ рдХреЛрдИ рдкрд╛рдмрдВрджреА рдирд╣реАрдВ рд▓рдЧрддреА. рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдЖрдкрдХреЗ рдбреЗрдЯрд╛рд╕реНрдЯреЛрд░ рдореЗрдВ рдореМрдЬреВрдж рдХрд┐рд╕реА рднреА рдХрд▓реЗрдХреНрд╢рди рдХреЛ рдкрдврд╝ рдФрд░ рдЙрд╕рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИ.
рдЗрди рдирд┐рдпрдореЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ, рдирд┐рдпрдореЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдХреБрдЫ рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ:
firestore.rules
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Messages:
// - Anyone can read.
// - Authenticated users can add and edit messages.
// - Validation: Check name is same as auth token and text length below 300 char or that imageUrl is a URL.
// - Deletes are not allowed.
match /messages/{messageId} {
allow read;
allow create, update: if request.auth != null
&& request.resource.data.name == request.auth.token.name
&& (request.resource.data.text is string
&& request.resource.data.text.size() <= 300
|| request.resource.data.imageUrl is string
&& request.resource.data.imageUrl.matches('https?://.*'));
allow delete: if false;
}
// FCM Tokens:
// - Anyone can write their token.
// - Reading list of tokens is not allowed.
match /fcmTokens/{token} {
allow read: if false;
allow write;
}
}
}
рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдирд┐рдпрдо, Emulator Suite рдореЗрдВ рдЕрдкрдиреЗ-рдЖрдк рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП.
Cloud Storage рдХреЗ рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рдпрдо рджреЗрдЦрдирд╛
Cloud Storage for Firebase, рдРрдХреНрд╕реЗрд╕ рдХреЗ рдЕрдзрд┐рдХрд╛рд░, рд╕реБрд░рдХреНрд╖рд╛, рдФрд░ рдбреЗрдЯрд╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдпрдореЛрдВ рдХреА рднрд╛рд╖рд╛ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ.
рдЗрд╕ рдХреЛрдбрд▓реИрдм рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, Firebase рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯ рдЕрдк рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдиреЗ Cloud Storage рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рдпрдо рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ рдерд╛. рдЗрд╕ рдирд┐рдпрдо рдХреЗ рддрд╣рдд, рд╕рд┐рд░реНрдлрд╝ рдкреБрд╖реНрдЯрд┐ рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реА Cloud Storage рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ. Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ, Storage рд╕реЗрдХреНрд╢рди рдХреЗ рдирд┐рдпрдо рдЯреИрдм рдореЗрдВ рдЬрд╛рдХрд░, рдирд┐рдпрдореЛрдВ рдХреЛ рджреЗрдЦрд╛ рдФрд░ рдЙрдирдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдЖрдкрдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рдпрдо рджрд┐рдЦреЗрдЧрд╛. рдЗрд╕рд╕реЗ рд╕рд╛рдЗрди рдЗрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐, рдЖрдкрдХреЗ рд╕реНрдЯреЛрд░реЗрдЬ рдмрдХреЗрдЯ рдореЗрдВ рдореМрдЬреВрдж рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝ рдФрд░ рдЙрд╕рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИ.
рдЖрдкрдХреЛ рдЗрди рдХрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
- рд╣рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рд┐рд░реНрдлрд╝ рдЕрдкрдиреЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛
- Cloud Storage рд╕реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛
- рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЗрдореЗрдЬ рд╣реЛрдВ
- рдЕрдкрд▓реЛрдб рдХреА рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реА рдЗрдореЗрдЬ рдХрд╛ рд╕рд╛рдЗрдЬрд╝ рдЬрд╝реНрдпрд╛рджрд╛ рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ 5 рдПрдордмреА рддрдХ рд╕реАрдорд┐рдд рдХрд░реЗрдВ
рдЗрд╕реЗ рдЗрди рдирд┐рдпрдореЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
storage.rules
rules_version = '2';
// Returns true if the uploaded file is an image and its size is below the given number of MB.
function isImageBelowMaxSize(maxSizeMB) {
return request.resource.size < maxSizeMB * 1024 * 1024
&& request.resource.contentType.matches('image/.*');
}
service firebase.storage {
match /b/{bucket}/o {
match /{userId}/{messageId}/{fileName} {
allow write: if request.auth != null && request.auth.uid == userId && isImageBelowMaxSize(5);
allow read;
}
}
}
15. рдмрдзрд╛рдИ рд╣реЛ!
рдЖрдкрдиреЗ рд░реАрдпрд▓-рдЯрд╛рдЗрдо рдореЗрдВ рдЪреИрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡реЗрдм рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Firebase рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИ!
рдЖрдкрдиреЗ рдХреНрдпрд╛-рдХреНрдпрд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИ
- Firebase App Hosting
- Firebase рд╕реЗ рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛
- Cloud Firestore
- Cloud Storage рдХреЗ рд▓рд┐рдП Firebase SDK
- Firebase рдХреНрд▓рд╛рдЙрдб рд╕реЗ рдореИрд╕реЗрдЬ
- Firebase рдкреНрд░рджрд░реНрд╢рди рдореЙрдирд┐рдЯрд░ рдХрд░рдирд╛
рдЕрдЧрд▓реЗ рдЪрд░рдг
рдЬрд╝реНрдпрд╛рджрд╛ рдЬрд╛рдиреЗрдВ
16. [рд╡реИрдХрд▓реНрдкрд┐рдХ] рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХреА рд╕реБрд╡рд┐рдзрд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛
Firebase App Check рдХреА рдорджрдж рд╕реЗ, рдЕрдкрдиреА рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдЕрдирдЪрд╛рд╣реЗ рдЯреНрд░реИрдлрд╝рд┐рдХ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рд╕рд╛рде рд╣реА, рдЕрдкрдиреЗ рдмреИрдХрдПрдВрдб рдХреЛ рдЧрд▓рдд рдЗрд╕реНрддреЗрдорд╛рд▓ рд╕реЗ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ. рдЗрд╕ рдЪрд░рдг рдореЗрдВ, рдЖрдкрдХреЛ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝рдиреА рд╣реЛрдЧреА. рд╕рд╛рде рд╣реА, App Check рдФрд░ reCAPTCHA Enterprise рдХреА рдорджрдж рд╕реЗ, рдмрд┐рдирд╛ рдЕрдиреБрдорддрд┐ рд╡рд╛рд▓реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛.
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ App Check рдФрд░ reCaptcha рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛.
reCaptcha Enterprise рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдирд╛
- Cloud Console рдореЗрдВ, рд╕реБрд░рдХреНрд╖рд╛ рд╕реЗрдХреНрд╢рди рдореЗрдВ рдЬрд╛рдХрд░ reCaptcha Enterprise рдХреЛ рдвреВрдВрдвреЗрдВ рдФрд░ рдЪреБрдиреЗрдВ.
- рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдореБрддрд╛рдмрд┐рдХ рд╕реЗрд╡рд╛ рдЪрд╛рд▓реВ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдХреА рдмрдирд╛рдПрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
- рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдореБрддрд╛рдмрд┐рдХ, рдбрд┐рд╕рдкреНрд▓реЗ рдиреЗрдо рдбрд╛рд▓реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдкреНрд▓реИрдЯрдлрд╝реЙрд░реНрдо рдЯрд╛рдЗрдк рдХреЗ рддреМрд░ рдкрд░ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдЪреБрдиреЗрдВ.
- рдбрд┐рдкреНрд▓реЙрдп рдХрд┐рдП рдЧрдП рдпреВрдЖрд░рдПрд▓ рдХреЛ рдбреЛрдореЗрди рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ. рд╕рд╛рде рд╣реА, рдкрдХреНрдХрд╛ рдХрд░реЗрдВ рдХрд┐ "рдЪреЗрдХрдмреЙрдХреНрд╕ рдЪреИрд▓реЗрдВрдЬ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ" рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реЛ.
- рдХреА рдмрдирд╛рдПрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЬрдирд░реЗрдЯ рдХреА рдЧрдИ рдХреА рдХреЛ рдХрд┐рд╕реА рд╕реБрд░рдХреНрд╖рд┐рдд рдЬрдЧрд╣ рдкрд░ рд╕реЗрд╡ рдХрд░рдХреЗ рд░рдЦреЗрдВ. рдЖрдкрдХреЛ рдЗрд╕ рдЪрд░рдг рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрдЧреА.
App Check рдХреА рд╕реБрд╡рд┐рдзрд╛ рдЪрд╛рд▓реВ рдХрд░рдирд╛
- Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ, рдмрд╛рдПрдВ рдкреИрдирд▓ рдореЗрдВ рдореМрдЬреВрдж Build рд╕реЗрдХреНрд╢рди рдкрд░ рдЬрд╛рдПрдВ.
- App Check рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, App Check рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдЗрди-рдЗрди рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЯреИрдм рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
- рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рдЬрдм рдЖрдкрд╕реЗ рдХрд╣рд╛ рдЬрд╛рдП, рддрдм reCaptcha Enterprise рдХреА рдХреБрдВрдЬреА рдбрд╛рд▓реЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рд╕реЗрд╡ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ.
- рдПрдкреАрдЖрдИ рд╡реНрдпреВ рдореЗрдВ, рд╕реНрдЯреЛрд░реЗрдЬ рдХреЛ рдЪреБрдиреЗрдВ. рдЗрд╕рдХреЗ рдмрд╛рдж, рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ. Cloud Firestore рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВ.
рдЕрдм App Check рд▓рд╛рдЧреВ рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП! рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд░реАрдлрд╝реНрд░реЗрд╢ рдХрд░реЗрдВ рдФрд░ рдмрд╛рддрдЪреАрдд рдХреЗ рдореИрд╕реЗрдЬ рджреЗрдЦрдиреЗ рдпрд╛ рднреЗрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ. рдЖрдкрдХреЛ рдЧрдбрд╝рдмрдбрд╝реА рдХрд╛ рдпрд╣ рдореИрд╕реЗрдЬ рджрд┐рдЦреЗрдЧрд╛:
Uncaught Error in snapshot listener: FirebaseError: [code=permission-denied]: Missing or insufficient permissions.
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ App Check, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдРрд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рдирдХреА рдкреБрд╖реНрдЯрд┐ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ. рдЕрдм рдЕрдкрдиреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝реЗрдВ.
рдЕрдкрдиреА environment.ts
рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ environment
рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ reCAPTCHAEnterpriseKey
рдЬреЛрдбрд╝реЗрдВ.
export const environment = {
firebase: {
apiKey: 'API_KEY',
authDomain: 'PROJECT_ID.firebaseapp.com',
databaseURL: 'https://PROJECT_ID.firebaseio.com',
projectId: 'PROJECT_ID',
storageBucket: 'PROJECT_ID.firebasestorage.app',
messagingSenderId: 'SENDER_ID',
appId: 'APP_ID',
measurementId: 'G-MEASUREMENT_ID',
},
reCAPTCHAEnterpriseKey: {
key: "Replace with your recaptcha enterprise site key"
},
};
key
рдХреА рд╡реИрд▓реНрдпреВ рдХреЛ рдЕрдкрдиреЗ reCaptcha Enterprise рдЯреЛрдХрди рд╕реЗ рдмрджрд▓реЗрдВ.
рдЗрд╕рдХреЗ рдмрд╛рдж, app.config.ts
рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдпреЗ рдЗрдВрдкреЛрд░реНрдЯ рдЬреЛрдбрд╝реЗрдВ:
import { getApp } from '@angular/fire/app';
import {
ReCaptchaEnterpriseProvider,
initializeAppCheck,
provideAppCheck,
} from '@angular/fire/app-check';
рдЙрд╕реА app.config.ts
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЧреНрд▓реЛрдмрд▓ рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдпрд╣ рдПрд▓рд╛рди рдЬреЛрдбрд╝реЗрдВ:
declare global {
var FIREBASE_APPCHECK_DEBUG_TOKEN: boolean;
}
@NgModule({ ...
рдЗрдВрдкреЛрд░реНрдЯ рдореЗрдВ, ReCaptchaEnterpriseProvider
рдХреА рдорджрдж рд╕реЗ App Check рдХреЛ рдЪрд╛рд▓реВ рдХрд░реЗрдВ. рд╕рд╛рде рд╣реА, рдЯреЛрдХрди рдХреЛ рдЕрдкрдиреЗ-рдЖрдк рд░реАрдлрд╝реНрд░реЗрд╢ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, isTokenAutoRefreshEnabled
рдХреЛ true
рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ.
imports: [
BrowserModule,
AppRoutingModule,
CommonModule,
FormsModule,
provideFirebaseApp(() => initializeApp(environment.firebase)),
provideAppCheck(() => {
const appCheck = initializeAppCheck(getApp(), {
provider: new ReCaptchaEnterpriseProvider(
environment.reCAPTCHAEnterpriseKey.key
),
isTokenAutoRefreshEnabled: true,
});
if (location.hostname === 'localhost') {
self.FIREBASE_APPCHECK_DEBUG_TOKEN = true;
}
return appCheck;
}),
рд╕реНрдерд╛рдиреАрдп рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, self.FIREBASE_APPCHECK_DEBUG_TOKEN
рдХреЛ true
рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ. localhost
рдореЗрдВ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд░реАрдлрд╝реНрд░реЗрд╢ рдХрд░рдиреЗ рдкрд░, рдХрдВрд╕реЛрд▓ рдореЗрдВ рдбреАрдмрдЧ рдЯреЛрдХрди рд▓реЙрдЧ рд╣реЛ рдЬрд╛рдПрдЧрд╛. рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
App Check debug token: CEFC0C76-7891-494B-B764-349BDFD00D00. You will need to add it to your app's App Check settings in the Firebase console for it to work.
рдЕрдм Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ, App Check рдХреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рд╡реНрдпреВ рдкрд░ рдЬрд╛рдПрдВ.
рдУрд╡рд░рдлрд╝реНрд▓реЛ рдореЗрдиреНрдпреВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдбреАрдмрдЧ рдЯреЛрдХрди рдореИрдиреЗрдЬ рдХрд░реЗрдВ рдЪреБрдиреЗрдВ.
рдЗрд╕рдХреЗ рдмрд╛рдж, рдбреАрдмрдЧ рдЯреЛрдХрди рдЬреЛрдбрд╝реЗрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреА рдХрдВрд╕реЛрд▓ рд╕реЗ рдбреАрдмрдЧ рдЯреЛрдХрди рдХреЛ рдЪрд┐рдкрдХрд╛рдПрдВ.
chat.service.ts
рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдпрд╣ рдЗрдВрдкреЛрд░реНрдЯ рдЬреЛрдбрд╝реЗрдВ:
import { AppCheck } from '@angular/fire/app-check';
рдЙрд╕реА chat.service.ts
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, App Check рдХреЛ рдЕрдиреНрдп Firebase рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВ.
export class ChatService {
appCheck: AppCheck = inject(AppCheck);
...
- "App Check рдХреА рдорджрдж рд╕реЗ, рдмрд┐рдирд╛ рдЕрдиреБрдорддрд┐ рд╡рд╛рд▓реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░реЗрдВ" рдореИрд╕реЗрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдорд┐рдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕реЗ рдЕрдкрдиреА GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ рдкреБрд╢ рдХрд░реЗрдВ.
- Firebase рдХрдВрд╕реЛрд▓ рдореЗрдВ App Hosting рдкреЗрдЬ рдЦреЛрд▓реЗрдВ рдФрд░ рдирдП рд░реЛрд▓рдЖрдЙрдЯ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░реЗрдВ.
рдмрдзрд╛рдИ рд╣реЛ! рдЕрдм рдЖрдкрдХреЗ рдРрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ App Check рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХрд╛рдо рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП.