1. खास जानकारी
इस कोडलैब में, Google App Engine पर एक वेब फ़्रंटएंड बनाया जाता है. इससे उपयोगकर्ता, वेब ऐप्लिकेशन से तस्वीरें अपलोड कर सकते हैं. साथ ही, अपलोड की गई तस्वीरों और उनके थंबनेल को भी ब्राउज़ कर सकते हैं.
इस वेब ऐप्लिकेशन में Bulma नाम के सीएसएस फ़्रेमवर्क का इस्तेमाल किया जाएगा. इससे यूज़र इंटरफ़ेस बेहतर तरीके से दिखेगा. साथ ही, ऐप्लिकेशन के एपीआई को कॉल करने के लिए, Vue.JS JavaScript फ़्रंटएंड फ़्रेमवर्क भी इस्तेमाल किया जाएगा.
इस ऐप्लिकेशन में तीन टैब होंगे:
- कोई होम पेज, जिस पर अपलोड की गई सभी इमेज के थंबनेल दिखेंगे. साथ ही, फ़ोटो के बारे में जानकारी देने वाले लेबल की सूची भी दिखेगी. ये लेबल, वे लेबल दिखेंगे जिनका पता Cloud Vision API ने पिछली लैब में लगाया था.
- एक कोलाज पेज जो सबसे हाल में अपलोड की गई 4 तस्वीरों से बना कोलाज दिखाएगा.
- अपलोड पेज, जहां उपयोगकर्ता नई फ़ोटो अपलोड कर सकते हैं.
इससे मिलने वाला फ़्रंटएंड इस तरह दिखता है:
वे तीनों पेज, सामान्य एचटीएमएल पेज हैं:
- होम पेज (
index.html
) पर, Node App Engine के बैकएंड कोड को कॉल किया जाता है, ताकि थंबनेल की तस्वीरों और उनके लेबल की सूची बनाई जा सके. इसके लिए,/api/pictures
यूआरएल पर AJAX कॉल किया जाता है. इस डेटा को फ़ेच करने के लिए, होम पेज Vue.js का इस्तेमाल कर रहा है. - कोलाज पेज (
collage.html
),collage.png
इमेज पर ले जाता है, जहां चार नई फ़ोटो इकट्ठा की जाती हैं. - अपलोड पेज (
upload.html
) पर,/api/pictures
यूआरएल पर पोस्ट करने के अनुरोध के ज़रिए एक फ़ोटो अपलोड की जा सकती है.
आपको क्या सीखने को मिलेगा
- App Engine
- Cloud Storage
- Cloud Firestore
2. सेटअप और ज़रूरी शर्तें
अपने हिसाब से एनवायरमेंट सेटअप करना
- Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से Gmail या Google Workspace खाता नहीं है, तो आपको नया खाता बनाना होगा.
- प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों का डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करता. साथ ही, आप इसे किसी भी समय अपडेट कर सकते हैं.
- प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होना चाहिए. साथ ही, आईडी को बदला नहीं जा सकता. सेट अप के बाद इसे बदला नहीं जा सकता. Cloud Console, एक यूनीक स्ट्रिंग अपने-आप जनरेट करता है; आम तौर पर, आपको उसके होने की कोई परवाह नहीं होती. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना पड़ता है और आम तौर पर इसकी पहचान
PROJECT_ID
के रूप में की जाती है. इसलिए, अगर आपको यह पसंद नहीं आता है, तो कोई भी कोड जनरेट करें. इसके अलावा, खुद का भी कोड बनाकर देखा जा सकता है कि वह उपलब्ध है या नहीं. फिर यह "फ़्रोज़न" होता है प्रोजेक्ट बनने के बाद. - तीसरी वैल्यू, प्रोजेक्ट नंबर है, जिसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
- इसके बाद, आपको क्लाउड संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी. इस कोडलैब का इस्तेमाल करने पर, आपको ज़्यादा पैसे नहीं चुकाने होंगे. इस ट्यूटोरियल के अलावा किसी अन्य प्लैटफ़ॉर्म पर बिलिंग न करने के लिए, संसाधनों को बंद करने के लिए, "साफ़-सफ़ाई" का पालन करें कोडलैब के आखिर में दिए गए निर्देश देखें. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले प्रोग्राम में हिस्सा ले सकते हैं.
Cloud Shell शुरू करना
Google Cloud को आपके लैपटॉप से, कहीं से भी ऑपरेट किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जा रहा है. यह क्लाउड में चलने वाला कमांड लाइन एनवायरमेंट है.
Google Cloud Console में जाकर, सबसे ऊपर दाईं ओर मौजूद टूलबार पर क्लाउड शेल आइकॉन पर क्लिक करें:
प्रावधान करने और एनवायरमेंट से कनेक्ट होने में कुछ ही समय लगेगा. उसके पूरा हो जाने पर, आपको कुछ ऐसा दिखाई देगा:
इस वर्चुअल मशीन में ऐसे सभी डेवलपमेंट टूल मौजूद हैं जिनकी आपको ज़रूरत पड़ेगी. यह पांच जीबी की स्थायी होम डायरेक्ट्री उपलब्ध कराता है और Google Cloud पर चलता है. यह नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रक्रिया को बेहतर बनाता है. इस लैब में आपका सारा काम बस एक ब्राउज़र से किया जा सकता है.
3. एपीआई चालू करें
App Engine को Compute Engine API की ज़रूरत होती है. पक्का करें कि यह चालू हो:
gcloud services enable compute.googleapis.com
आपको यह कार्रवाई पूरी तरह से दिखेगी:
Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.
4. कोड का क्लोन बनाएं
अगर आपने पहले से कोड नहीं किया है, तो उसे चेकआउट करें:
git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop
इसके बाद आप फ़्रंटएंड वाली डायरेक्ट्री पर जा सकते हैं:
cd serverless-photosharing-workshop/frontend
आपके पास फ़्रंटएंड के लिए यह फ़ाइल लेआउट होगा:
frontend | ├── index.js ├── package.json ├── app.yaml | ├── public | ├── index.html ├── collage.html ├── upload.html | ├── app.js ├── script.js ├── style.css
हमारे प्रोजेक्ट के रूट में, आपके पास तीन फ़ाइलें होती हैं:
index.js
में Node.js कोड शामिल होता हैpackage.json
, लाइब्रेरी डिपेंडेंसी के बारे में बताता हैapp.yaml
Google App Engine की कॉन्फ़िगरेशन फ़ाइल है
public
फ़ोल्डर में स्टैटिक रिसॉर्स होते हैं:
index.html
ऐसा पेज है जिस पर सभी थंबनेल तस्वीरें और लेबल दिखते हैंcollage.html
हाल ही की तस्वीरों का कोलाज दिखाता हैupload.html
में नई फ़ोटो अपलोड करने के लिए एक फ़ॉर्म मौजूद हैindex.html
पेज को डेटा से भरने के लिए,app.js
, Vue.js का इस्तेमाल कर रहा हैscript.js
, नेविगेशन मेन्यू और उसका "हैमबर्गर" हैंडल करता है छोटी स्क्रीन पर आइकॉनstyle.css
में कुछ सीएसएस डायरेक्टिव के बारे में बताया गया है
5. कोड एक्सप्लोर करें
डिपेंडेंसी
package.json
फ़ाइल, ज़रूरी लाइब्रेरी डिपेंडेंसी के बारे में बताती है:
{
"name": "frontend",
"version": "0.0.1",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"@google-cloud/firestore": "^3.4.1",
"@google-cloud/storage": "^4.0.0",
"express": "^4.16.4",
"dayjs": "^1.8.22",
"bluebird": "^3.5.0",
"express-fileupload": "^1.1.6"
}
}
हमारा आवेदन इन बातों पर निर्भर करता है:
- firestore: हमारे तस्वीर मेटाडेटा से Cloud Firestore को ऐक्सेस करने के लिए,
- स्टोरेज: Google Cloud Storage को ऐक्सेस करने के लिए, जहां तस्वीरें सेव होती हैं,
- expression: Node.js के लिए वेब फ़्रेमवर्क
- dayjs: तारीखों को लोगों के हिसाब से दिखाने के लिए एक छोटी लाइब्रेरी,
- bluebird: JavaScript प्रॉमिस लाइब्रेरी,
- expression-fileupload: यह एक लाइब्रेरी है, जिसकी मदद से फ़ाइल के अपलोड को आसानी से मैनेज किया जा सकता है.
एक्सप्रेस फ़्रंटएंड
index.js
कंट्रोलर की शुरुआत में, आपको package.json
में पहले बताई गई सभी डिपेंडेंसी की ज़रूरत होगी:
const express = require('express');
const fileUpload = require('express-fileupload');
const Firestore = require('@google-cloud/firestore');
const Promise = require("bluebird");
const {Storage} = require('@google-cloud/storage');
const storage = new Storage();
const path = require('path');
const dayjs = require('dayjs');
const relativeTime = require('dayjs/plugin/relativeTime')
dayjs.extend(relativeTime)
इसके बाद, Express ऐप्लिकेशन इंस्टेंस बनाया जाता है.
दो एक्सप्रेस मिडलवेयर का इस्तेमाल किया जाता है:
express.static()
कॉल से पता चलता है कि स्टैटिक संसाधनpublic
सब-डायरेक्ट्री में उपलब्ध होंगे.- साथ ही,
fileUpload()
फ़ाइल अपलोड को कॉन्फ़िगर करता है, ताकि फ़ाइल का साइज़ 10 एमबी तक सीमित किया जा सके. ऐसा इसलिए किया जाता है, ताकि/tmp
डायरेक्ट्री के इन-मेमोरी फ़ाइल सिस्टम में फ़ाइलों को स्थानीय तौर पर अपलोड किया जा सके.
const app = express();
app.use(express.static('public'));
app.use(fileUpload({
limits: { fileSize: 10 * 1024 * 1024 },
useTempFiles : true,
tempFileDir : '/tmp/'
}))
स्टैटिक रिसॉर्स में, आपके पास होम पेज, कोलाज पेज, और अपलोड पेज की एचटीएमएल फ़ाइलें होती हैं. ऐसे पेज, एपीआई बैकएंड को कॉल करेंगे. इस एपीआई में ये एंडपॉइंट होंगे:
POST /api/pictures
upload.html में दिए गए फ़ॉर्म के ज़रिए, पोस्ट अनुरोध के ज़रिए तस्वीरें अपलोड की जाएंगीGET /api/pictures
यह एंडपॉइंट, इमेज और उनके लेबल की सूची वाला JSON दस्तावेज़ दिखाता हैGET /api/pictures/:name
यह यूआरएल, इमेज के क्लाउड स्टोरेज की जगह पर रीडायरेक्ट करता हैGET /api/thumbnails/:name
यह यूआरएल, थंबनेल इमेज के क्लाउड स्टोरेज की जगह पर रीडायरेक्ट करता हैGET /api/collage
यह आखिरी यूआरएल, जनरेट की गई कोलाज इमेज के क्लाउड स्टोरेज की जगह पर रीडायरेक्ट करता है
तस्वीर अपलोड करें
फ़ोटो अपलोड Node.js कोड को एक्सप्लोर करने से पहले, public/upload.html
पर एक नज़र डालें.
...
<form method="POST" action="/api/pictures" enctype="multipart/form-data">
...
<input type="file" name="pictures">
<button>Submit</button>
...
</form>
...
फ़ॉर्म एलिमेंट, एचटीटीपी पीओएसटी तरीके से और कई हिस्सों वाले फ़ॉर्मैट के साथ, /api/pictures
एंडपॉइंट पर ले जाता है. index.js
को अब उस एंडपॉइंट और तरीके का जवाब देना होगा और फ़ाइलें एक्सट्रैक्ट करनी होंगी:
app.post('/api/pictures', async (req, res) => {
if (!req.files || Object.keys(req.files).length === 0) {
console.log("No file uploaded");
return res.status(400).send('No file was uploaded.');
}
console.log(`Receiving files ${JSON.stringify(req.files.pictures)}`);
const pics = Array.isArray(req.files.pictures) ? req.files.pictures : [req.files.pictures];
pics.forEach(async (pic) => {
console.log('Storing file', pic.name);
const newPicture = path.resolve('/tmp', pic.name);
await pic.mv(newPicture);
const pictureBucket = storage.bucket(process.env.BUCKET_PICTURES);
await pictureBucket.upload(newPicture, { resumable: false });
});
res.redirect('/');
});
सबसे पहले, देखें कि क्या फ़ाइलें अपलोड की जा रही हैं. इसके बाद, हमारे फ़ाइल अपलोड नोड मॉड्यूल से मिलने वाले mv
तरीके की मदद से, फ़ाइलों को स्थानीय तौर पर डाउनलोड किया जा सकता है. अब फ़ाइलें आपके डिवाइस के फ़ाइल सिस्टम पर उपलब्ध हैं. इसलिए, इमेज को Cloud Storage बकेट में अपलोड किया जा सकता है. आखिर में, उपयोगकर्ता को ऐप्लिकेशन की मुख्य स्क्रीन पर वापस रीडायरेक्ट किया जाता है.
तस्वीरों की सूची बनाना
अपने सुंदर चित्र दिखाने का समय आ गया है!
/api/pictures
हैंडलर में, सभी तस्वीरें (जिनका थंबनेल जनरेट किया गया है) बनाने के लिए, Firestore डेटाबेस के pictures
कलेक्शन में जाएं. इन तस्वीरों को, डेटा बनाने की घटते क्रम में लगाया जाता है.
आप हर तस्वीर को JavaScript अरे में पुश करते हैं. साथ ही, उसके नाम, ब्यौरा देने वाले लेबल (Cloud Vision API से आने वाले लेबल), मुख्य रंग, और कॉन्टेंट बनाने की आसान तारीख (dayjs
के साथ, हम "अब से 3 दिन बाद" जैसे टाइम ऑफ़सेट को बांटते हैं.
app.get('/api/pictures', async (req, res) => {
console.log('Retrieving list of pictures');
const thumbnails = [];
const pictureStore = new Firestore().collection('pictures');
const snapshot = await pictureStore
.where('thumbnail', '==', true)
.orderBy('created', 'desc').get();
if (snapshot.empty) {
console.log('No pictures found');
} else {
snapshot.forEach(doc => {
const pic = doc.data();
thumbnails.push({
name: doc.id,
labels: pic.labels,
color: pic.color,
created: dayjs(pic.created.toDate()).fromNow()
});
});
}
console.table(thumbnails);
res.send(thumbnails);
});
यह कंट्रोलर नीचे दिए गए आकार के नतीजे दिखाता है:
[
{
"name": "IMG_20180423_163745.jpg",
"labels": [
"Dish",
"Food",
"Cuisine",
"Ingredient",
"Orange chicken",
"Produce",
"Meat",
"Staple food"
],
"color": "#e78012",
"created": "a day ago"
},
...
]
इस डेटा स्ट्रक्चर का इस्तेमाल, index.html
पेज से एक छोटे Vue.js स्निपेट के ज़रिए किया जाता है. इस पेज से मार्कअप का आसान वर्शन यहां दिया गया है:
<div id="app">
<div class="container" id="app">
<div id="picture-grid">
<div class="card" v-for="pic in pictures">
<div class="card-content">
<div class="content">
<div class="image-border" :style="{ 'border-color': pic.color }">
<a :href="'/api/pictures/' + pic.name">
<img :src="'/api/thumbnails/' + pic.name">
</a>
</div>
<a class="panel-block" v-for="label in pic.labels" :href="'/?q=' + label">
<span class="panel-icon">
<i class="fas fa-bookmark"></i>
</span>
{{ label }}
</a>
</div>
</div>
</div>
</div>
</div>
</div>
div की आईडी Vue.js को बताएगी कि यह मार्कअप का हिस्सा है जिसे डायनैमिक रूप से रेंडर किया जाएगा. ये बदलाव, v-for
के डायरेक्टिव की मदद से किए गए हैं.
तस्वीरों में मुख्य रंग के हिसाब से अच्छा रंगीन बॉर्डर मिलता है, जैसा कि Cloud Vision API से मिलता है. हम लिंक और इमेज के सोर्स में थंबनेल और पूरी चौड़ाई वाली तस्वीरों की ओर इशारा करते हैं.
अंत में, हम चित्र का वर्णन करने वाले लेबल की सूची बनाते हैं.
Vue.js स्निपेट के लिए JavaScript कोड यहां दिया गया है (index.html
पेज के निचले हिस्से पर इंपोर्ट की गई public/app.js
फ़ाइल में):
var app = new Vue({
el: '#app',
data() {
return { pictures: [] }
},
mounted() {
axios
.get('/api/pictures')
.then(response => { this.pictures = response.data })
}
})
हमारे /api/pictures
एंडपॉइंट पर AJAX कॉल करने के लिए, Vue कोड, Axios लाइब्रेरी का इस्तेमाल कर रहा है. इसके बाद, नतीजों में दिखने वाला डेटा, उस मार्कअप में मौजूद व्यू कोड से जुड़ जाता है जो आपने पहले देखा था.
तस्वीरें देखना
index.html
से हमारे उपयोगकर्ता तस्वीरों के थंबनेल देख सकते हैं, पूरे साइज़ की इमेज देखने के लिए उन पर क्लिक कर सकते हैं. साथ ही, हमारे उपयोगकर्ता collage.html
से collage.png
इमेज देख सकते हैं.
इन पेजों के एचटीएमएल मार्कअप में, src
इमेज और href
लिंक उन तीन एंडपॉइंट पर पॉइंट करते हैं जो इमेज, थंबनेल, और कोलाज की Cloud Storage की जगह पर रीडायरेक्ट करते हैं. एचटीएमएल मार्कअप में पाथ को हार्ड कोड करने की ज़रूरत नहीं है.
app.get('/api/pictures/:name', async (req, res) => {
res.redirect(`https://storage.cloud.google.com/${process.env.BUCKET_PICTURES}/${req.params.name}`);
});
app.get('/api/thumbnails/:name', async (req, res) => {
res.redirect(`https://storage.cloud.google.com/${process.env.BUCKET_THUMBNAILS}/${req.params.name}`);
});
app.get('/api/collage', async (req, res) => {
res.redirect(`https://storage.cloud.google.com/${process.env.BUCKET_THUMBNAILS}/collage.png`);
});
नोड ऐप्लिकेशन चल रहा है
सभी एंडपॉइंट तय करके, आपका Node.js ऐप्लिकेशन लॉन्च के लिए तैयार है. एक्सप्रेस ऐप्लिकेशन डिफ़ॉल्ट रूप से पोर्ट 8080 पर गौर करता है और आने वाले अनुरोधों को पूरा करने के लिए तैयार है.
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
console.log(`Started web frontend service on port ${PORT}`);
console.log(`- Pictures bucket = ${process.env.BUCKET_PICTURES}`);
console.log(`- Thumbnails bucket = ${process.env.BUCKET_THUMBNAILS}`);
});
6. स्थानीय तौर पर टेस्ट करें
क्लाउड पर डिप्लॉय करने से पहले, कोड को स्थानीय तौर पर टेस्ट करके पक्का कर लें कि वह काम कर रहा है.
आपको Cloud Storage के दो बकेट से जुड़े दो एनवायरमेंट वैरिएबल एक्सपोर्ट करने होंगे:
export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT} export BUCKET_PICTURES=uploaded-pictures-${GOOGLE_CLOUD_PROJECT}
frontend
फ़ोल्डर में, एनपीएम डिपेंडेंसी इंस्टॉल करें और सर्वर चालू करें:
npm install; npm start
अगर सब कुछ ठीक हो गया था, तो इसे पोर्ट 8080 पर सर्वर शुरू करना चाहिए:
Started web frontend service on port 8080 - Pictures bucket = uploaded-pictures-${GOOGLE_CLOUD_PROJECT} - Thumbnails bucket = thumbnails-${GOOGLE_CLOUD_PROJECT}
उन लॉग में, आपके बकेट के असली नाम दिखेंगे. इससे डीबग करने में मदद मिलेगी.
Cloud Shell से, वेब पर झलक देखने की सुविधा का इस्तेमाल करके, डिवाइस पर चल रहे ऐप्लिकेशन को ब्राउज़र में इस्तेमाल किया जा सकता है:
बाहर निकलने के लिए, CTRL-C
का इस्तेमाल करें.
7. App Engine में डिप्लॉय करें
आपका ऐप्लिकेशन डिप्लॉय किए जाने के लिए तैयार है.
App Engine को कॉन्फ़िगर करना
App Engine के लिए app.yaml
कॉन्फ़िगरेशन फ़ाइल की जांच करें:
runtime: nodejs16 env_variables: BUCKET_PICTURES: uploaded-pictures-GOOGLE_CLOUD_PROJECT BUCKET_THUMBNAILS: thumbnails-GOOGLE_CLOUD_PROJECT
पहली लाइन से पता चलता है कि रनटाइम, Node.js 10 पर आधारित है. ओरिजनल इमेज और थंबनेल के लिए, दो एनवायरमेंट वैरिएबल, दो बकेट को पॉइंट करने के लिए तय किए गए हैं.
GOOGLE_CLOUD_PROJECT
को अपने असल प्रोजेक्ट आईडी से बदलने के लिए, यह निर्देश दिया जा सकता है:
sed -i -e "s/GOOGLE_CLOUD_PROJECT/${GOOGLE_CLOUD_PROJECT}/" app.yaml
डिप्लॉय करें
App Engine के लिए अपना पसंदीदा क्षेत्र सेट करें. पक्का करें कि आपने पिछली लैब में उसी क्षेत्र का इस्तेमाल किया हो:
gcloud config set compute/region europe-west1
और इन्हें डिप्लॉय करें:
gcloud app deploy
एक या दो मिनट बाद, आपको बताया जाएगा कि ऐप्लिकेशन ट्रैफ़िक भेज रहा है:
Beginning deployment of service [default]... ╔════════════════════════════════════════════════════════════╗ ╠═ Uploading 8 files to Google Cloud Storage ═╣ ╚════════════════════════════════════════════════════════════╝ File upload done. Updating service [default]...done. Setting traffic split for service [default]...done. Deployed service [default] to [https://GOOGLE_CLOUD_PROJECT.appspot.com] You can stream logs from the command line by running: $ gcloud app logs tail -s default To view your application in the web browser run: $ gcloud app browse
यह देखने के लिए कि ऐप्लिकेशन डिप्लॉय किया गया है या नहीं, Cloud Console के App Engine सेक्शन में जाकर भी, App Engine की सुविधाओं के बारे में जाना जा सकता है. इनमें वर्शन बनाने और ट्रैफ़िक के बंटवारे जैसी सुविधाएं शामिल हैं:
8. ऐप्लिकेशन का परीक्षण करें
जांच करने के लिए, ऐप्लिकेशन (https://<YOUR_PROJECT_ID>.appspot.com/
) ऐप्लिकेशन के डिफ़ॉल्ट App Engine यूआरएल पर जाएं और आपको फ़्रंटएंड यूज़र इंटरफ़ेस (यूआई) तैयार होते हुए दिखना चाहिए!
9. स्टोरेज खाली करें (ज़रूरी नहीं)
अगर आपको ऐप्लिकेशन का इस्तेमाल नहीं करना है, तो संसाधनों को खाली किया जा सकता है. इससे प्रोजेक्ट को मिटाया जा सकता है और कम से कम खर्च किया जा सकता है. साथ ही, एक अच्छा क्लाउड सिटिज़न भी बन सकता है:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}
10. बधाई हो!
बधाई हो! App Engine पर होस्ट किया गया यह Node.js वेब ऐप्लिकेशन, आपकी सभी सेवाओं को एक साथ बाइंड करता है. साथ ही, आपके उपयोगकर्ताओं को तस्वीरें अपलोड करने और विज़ुअलाइज़ करने की सुविधा देता है.
इसमें हमने इन विषयों के बारे में बताया
- App Engine
- Cloud Storage
- Cloud Firestore