ফার্স্ট জেনারেশন ফাংশন ব্যবহার করা অ্যাপগুলিকে এই গাইডের নির্দেশাবলী ব্যবহার করে সেকেন্ড জেনারেশনে মাইগ্রেট করার কথা বিবেচনা করা উচিত। ২য় জেনারেশন ফাংশন Cloud Run ব্যবহার করে আরও ভালো পারফর্ম্যান্স, আরও ভালো কনফিগারেশন, আরও ভালো মনিটরিং এবং আরও অনেক কিছু প্রদান করে।
এই ডকুমেন্টের উদাহরণগুলি ধরে নেয় যে আপনি CommonJS
মডিউল
(require স্টাইল ইম্পোর্ট) সহ JavaScript ব্যবহার করছেন, তবে একই নীতি ESM
(import … from স্টাইল ইম্পোর্ট) এবং TypeScript সহ JavaScript-এর ক্ষেত্রে প্রযোজ্য।
মাইগ্রেশন প্রসেস
ফার্স্ট জেনারেশন ও সেকেন্ড জেনারেশন ফাংশন একই সোর্স ফাইলে পাশাপাশি থাকতে পারে। এর ফলে আপনি নিজের সুবিধা মতো ধীরে ধীরে আপনার কোডবেস মাইগ্রেট করতে পারবেন। তবে মনে রাখবেন, প্যাকেজের এই মিশ্রণ একটি একক, স্বতন্ত্র ফাংশন-এর মধ্যে কাজ করে না।
আমরা একবারে একটি ফাংশন মাইগ্রেট করার, টেস্টিং ও যাচাইকরণ করার পরে পরবর্তী ধাপে যাওয়ার সাজেশন দিই।
Firebase CLI এবং firebase-functions ভার্সন যাচাই করুন
আপনি অন্তত Firebase CLI ভার্সন 12.00 এবং
firebase-functions ভার্সন 4.3.0 ব্যবহার করছেন কিনা তা নিশ্চিত করুন। যেকোনও নতুন ভার্সনে ফার্স্ট জেনারেশনের পাশাপাশি সেকেন্ড জেনারেশনও
কাজ করবে।
ইম্পোর্ট আপডেট করুন
২য় জেনারেশন ফাংশন firebase-functions SDK-এর v2 সাবপ্যাকেজ থেকে ইমপোর্ট করা হয়। এই আলাদা ইমপোর্ট পাথ হল সেইসব কিছু যা Firebase CLI-এর প্রয়োজন হয়
আপনার ফাংশন কোডকে ১ম বা ২য় জেনারেশন ফাংশন হিসেবে ডেপ্লয় করতে হবে কিনা তা নির্ধারণ করতে।
v2 সাবপ্যাকেজটি মডিউলার এবং আমরা সাজেস্ট করি যে আপনার প্রয়োজন অনুযায়ী নির্দিষ্ট মডিউল
ইমপোর্ট করুন।
আগে: ফার্স্ট জেনারেশন
const functions = require("firebase-functions/v1");
এর পরে: ২য় জেনারেশন
// explicitly import each trigger
const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");
ট্রিগারের সংজ্ঞা আপডেট করুন
২য় জেনারেশন SDK মডিউলার ইমপোর্টকে অগ্রাধিকার দেয়, তাই আগের ধাপ থেকে পরিবর্তিত ইমপোর্টকে প্রতিফলিত করতে ট্রিগার সংজ্ঞা আপডেট করুন।
কিছু ট্রিগারের জন্য কলব্যাকে পাস করা আর্গুমেন্ট পরিবর্তন করা হয়েছে। এই
উদাহরণে, লক্ষ্য করুন যে onDocumentCreated কলব্যাকের আর্গুমেন্টগুলি
একটি একক event অবজেক্টে একত্রিত করা হয়েছে। এছাড়াও, কিছু ট্রিগারে সুবিধাজনক নতুন কনফিগারেশন ফিচার আছে, যেমন onRequest ট্রিগারের cors
বিকল্প।
আগে: ফার্স্ট জেনারেশন
const functions = require("firebase-functions/v1");
exports.date = functions.https.onRequest((req, res) => {
// ...
});
exports.uppercase = functions.firestore
.document("my-collection/{docId}")
.onCreate((change, context) => {
// ...
});
এর পরে: ২য় জেনারেশন
const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");
exports.date = onRequest({cors: true}, (req, res) => {
// ...
});
exports.uppercase = onDocumentCreated("my-collection/{docId}", (event) => {
/* ... */
});
জাভাস্ক্রিপ্ট ডেস্ট্রাকচারিংয়ের মাধ্যমে রিরাইট করার প্রচেষ্টা কম করুন
আপনার ফাংশনে যদি জটিল বডি থাকে যা ফার্স্ট জেনারেশন কনটেক্সট বা
প্রোভাইডার-নির্দিষ্ট প্যারামিটারের (যেমন message বা snapshot) উপর ব্যাপকভাবে নির্ভর করে, তাহলে আপনি সেকেন্ড জেনারেশন SDK-তে তৈরি ফার্স্ট
জেনারেশন কম্প্যাটিবিলিটি হেল্পার ব্যবহার করতে পারেন।
২য় জেনারেশন SDK অটোমেটিক ইভেন্ট অবজেক্টকে গেটারের সাথে প্যাচ করে যা ১ম জেনারেশন সিগনেচারের সাথে মেলে। এটি আপনাকে হ্যান্ডলার সিগনেচারে সরাসরি এইসব প্রপার্টি এক্সট্র্যাক্ট করতে জাভাস্ক্রিপ্ট ডিস্ট্রাকচারিং ব্যবহার করতে দেয়, যার ফলে আপনার ফাংশন লজিক আবার লেখার প্রয়োজনীয়তা কমে যায়।
প্রদানকারী ম্যাপিং রেফারেন্স
| প্রদানকারী | ফার্স্ট জেনারেশন আর্গুমেন্ট | ২য় জেনারেশন প্যাচ করা ইভেন্ট ডেস্ট্রাকচারিং |
| Pub/Sub | (message, context)
|
({ message, context }) => { ... }
|
| Cloud Firestore | (snapshot, context)
|
({ snapshot, context }) => { ... }
|
| Cloud Storage | (object, context)
|
({ object, context }) => { ... }
|
| Realtime Database | (snapshot, context)
|
({ snapshot, context }) => { ... }
|
| Remote Config | (version, context)
|
({ version, context }) => { ... }
|
| Cloud Scheduler | (context)
|
({ context }) => { ... }
|
| টাস্কের সারি | (data, context)
|
({ data, context }) => { ... }
|
আগে (ফার্স্ট জেনারেশন):
export const myPubSubV1 = functions.pubsub.topic("my-topic").onPublish((message, context) => {
const data = message.json;
const eventId = context.eventId;
// ... rest of the logic
});
নতুন বিকল্প (ডিস্ট্রাকচারিং সহ ২য় জেনারেশন):
import { onMessagePublished } from "firebase-functions/v2/pubsub";
export const myPubSubV2 = onMessagePublished("my-topic", ({ message, context }) => {
// No need to change the function body!
const data = message.json; // Uses v1 Message wrapper
const eventId = context.eventId; // Uses v1 EventContext map
// ... rest of the logic
});
প্যারামিটারাইজড কনফিগারেশন ব্যবহার করুন
২য় জেনারেশন ফাংশন functions.config-এর জন্য সহায়তা বন্ধ করে দেয়, যাতে আপনার কোডবেসের মধ্যে কনফিগারেশন প্যারামিটার ডিক্লেরেটিভভাবে সংজ্ঞায়িত করার জন্য আরও সুরক্ষিত ইন্টারফেস প্রদান করা যায়।
নতুন params মডিউলের মাধ্যমে, CLI ডিপ্লয়মেন্ট ব্লক করে দেয়, যতক্ষণ না সব প্যারামিটারের
সঠিক ভ্যালু থাকে, যাতে কোনও ফাংশন মিসিং কনফিগারেশনের সাথে ডিপ্লয় না হয়।
আগে: ফার্স্ট জেনারেশন
const functions = require("firebase-functions/v1");
exports.getQuote = functions.https.onRequest(async (req, res) => {
const quote = await fetchMotivationalQuote(functions.config().apiKey);
// ...
});
এর পরে: ২য় জেনারেশন
const {onRequest} = require("firebase-functions/v2/https");
const {defineSecret} = require("firebase-functions/params");
// Define the secret parameter
const apiKey = defineSecret("API_KEY");
exports.getQuote = onRequest(
// make the secret available to this function
{ secrets: [apiKey] },
async (req, res) => {
// retrieve the value of the secret
const quote = await fetchMotivationalQuote(apiKey.value());
// ...
}
);
functions.config-এর সাথে আপনার আগে থেকে থাকা এনভায়রনমেন্ট কনফিগারেশন থাকলে, ২য় জেনারেশনে আপগ্রেড করার অংশ হিসেবে এই কনফিগারেশন মাইগ্রেট করুন।
functions.config API বন্ধ করা হয়েছে এবং ২০২৭ সালের মার্চ মাসে এটি সরিয়ে দেওয়া হবে।
সেই তারিখের পরে, functions.config-এর সাথে ডিপ্লয়মেন্ট করা যাবে না।
ডিপ্লয়মেন্ট সংক্রান্ত সমস্যা এড়াতে, Firebase CLI ব্যবহার করে আপনার কনফিগারেশন Cloud Secret Manager-এ মাইগ্রেট করুন। আপনার কনফিগারেশন মাইগ্রেট করার জন্য সবচেয়ে কার্যকর এবং নিরাপদ উপায় হিসেবে এটি করার জন্য বিশেষভাবে সাজেস্ট করা হচ্ছে।
Firebase CLI-এর মাধ্যমে কনফিগারেশন এক্সপোর্ট করা
আপনার আগে থেকে থাকা এনভায়রনমেন্ট কনফিগারেশন Cloud Secret Manager-এ নতুন সিক্রেটে এক্সপোর্ট করতে
config exportকমান্ড ব্যবহার করুন:$ firebase functions:config:export i This command retrieves your Runtime Config values (accessed via functions.config()) and exports them as a Secret Manager secret. i Fetching your existing functions.config() from your project... ✔ Fetched your existing functions.config(). i Configuration to be exported: ⚠ This may contain sensitive data. Do not share this output. { ... } ✔ What would you like to name the new secret for your configuration? RUNTIME_CONFIG ✔ Created new secret version projects/project/secrets/RUNTIME_CONFIG/versions/1```সিক্রেট বাইন্ড করতে ফাংশন কোড আপডেট করুন
Cloud Secret Manager-এ নতুন সিক্রেটে স্টোর করা কনফিগারেশন ব্যবহার করতে, আপনার ফাংশন সোর্সে
defineJsonSecretAPI ব্যবহার করুন। এছাড়াও, যেসব ফাংশনে সিক্রেট প্রয়োজন, সেগুলিতে সিক্রেট বাউন্ড করা আছে কিনা তা নিশ্চিত করুন।আগে
const functions = require("firebase-functions/v1"); exports.myFunction = functions.https.onRequest((req, res) => { const apiKey = functions.config().someapi.key; // ... });পরে
const { onRequest } = require("firebase-functions/v2/https"); const { defineJsonSecret } = require("firebase-functions/params"); const config = defineJsonSecret("RUNTIME_CONFIG"); exports.myFunction = onRequest( // Bind secret to your function { secrets: [config] }, (req, res) => { // Access secret values via .value() const apiKey = config.value().someapi.key; // ... });ফাংশন ডিপ্লয় করা
পরিবর্তনগুলি প্রয়োগ করতে এবং গোপন অনুমতিগুলি বাইন্ড করতে আপনার আপডেট করা ফাংশনগুলি ডিপ্লয় করুন।
firebase deploy --only functions:<your-function-name>
রানটাইম সংক্রান্ত বিকল্প সেট করা
রানটাইম বিকল্পের কনফিগারেশন ১ম ও ২য় জেনারেশনের মধ্যে পরিবর্তিত হয়েছে। ২য় জেনারেশন সব ফাংশনের জন্য বিকল্প সেট করার নতুন ক্ষমতাও যোগ করে।
আগে: ফার্স্ট জেনারেশন
const functions = require("firebase-functions/v1");
exports.date = functions
.runWith({
// Keep 5 instances warm for this latency-critical function
minInstances: 5,
})
// locate function closest to users
.region("asia-northeast1")
.https.onRequest((req, res) => {
// ...
});
exports.uppercase = functions
// locate function closest to users and database
.region("asia-northeast1")
.firestore.document("my-collection/{docId}")
.onCreate((change, context) => {
// ...
});
এর পরে: ২য় জেনারেশন
const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");
const {setGlobalOptions} = require("firebase-functions/v2");
// locate all functions closest to users
setGlobalOptions({ region: "asia-northeast1" });
exports.date = onRequest({
// Keep 5 instances warm for this latency-critical function
minInstances: 5,
}, (req, res) => {
// ...
});
exports.uppercase = onDocumentCreated("my-collection/{docId}", (event) => {
/* ... */
});
ডিফল্ট পরিষেবা অ্যাকাউন্ট আপডেট করুন (ঐচ্ছিক)
ফার্স্ট জেনারেশন ফাংশন Firebase API-তে অ্যাক্সেস অনুমোদন করতে Google App Engine ডিফল্ট পরিষেবা অ্যাকাউন্ট ব্যবহার করে, সেখানে সেকেন্ড জেনারেশন ফাংশন Compute Engine ডিফল্ট পরিষেবা অ্যাকাউন্ট ব্যবহার করে। এই পার্থক্যের কারণে, আপনি যদি ফার্স্ট জেনারেশন পরিষেবা অ্যাকাউন্টে বিশেষ অনুমতি দিয়ে থাকেন, তাহলে সেকেন্ড জেনারেশনে মাইগ্রেট করা ফাংশনের ক্ষেত্রে অনুমতি সংক্রান্ত সমস্যা হতে পারে। আপনি কোনও পরিষেবা অ্যাকাউন্টের অনুমতি পরিবর্তন না করে থাকলে, এই ধাপটি এড়িয়ে যেতে পারেন।
সাজেস্ট করা সমাধান হল, আপনি যেসব ফাংশন ২য় জেনারেশনে মাইগ্রেট করতে চান,
সেগুলিতে আগে থেকে থাকা ১ম জেনারেশন App Engine ডিফল্ট পরিষেবা অ্যাকাউন্ট স্পষ্টভাবে অ্যাসাইন করা,
২য় জেনারেশন ডিফল্ট ওভাররাইড করা। প্রতিটি মাইগ্রেট করা ফাংশন serviceAccountEmail-এর জন্য সঠিক ভ্যালু সেট করছে কিনা তা নিশ্চিত করে আপনি এটি করতে পারেন:
const {onRequest} = require("firebase-functions/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");
const {setGlobalOptions} = require("firebase-functions");
// Use the App Engine default service account for all functions
setGlobalOptions({serviceAccountEmail: '<my-project-number>@<wbr>appspot.gserviceaccount.com'});
// Now I use the App Engine default service account.
exports.date = onRequest({cors: true}, (req, res) => {
// ...
});
// I do too!
exports.uppercase = onDocumentCreated("my-collection/{docId}", (event) => {
// ...
});
বিকল্প হিসেবে, আপনি App Engine ডিফল্ট পরিষেবা অ্যাকাউন্ট (ফার্স্ট জেনারেশনের জন্য) এবং Compute Engine ডিফল্ট পরিষেবা অ্যাকাউন্ট (সেকেন্ড জেনারেশনের জন্য) দুটিতেই সমস্ত প্রয়োজনীয় অনুমতির সাথে মিল রেখে পরিষেবা অ্যাকাউন্টের বিবরণ পরিবর্তন করতে পারেন।
কনকারেন্সি ব্যবহার করুন
২য় জেনারেশন ফাংশনের একটি উল্লেখযোগ্য সুবিধা হল, একটি ফাংশন ইনস্ট্যান্স একসাথে একাধিক অনুরোধের উত্তর দিতে পারে। এর ফলে ব্যবহারকারীদের কোল্ড স্টার্টের অভিজ্ঞতা অনেকটা কমে যেতে পারে। ডিফল্ট হিসেবে, কনকারেন্সি ৮০-তে সেট করা থাকে, তবে আপনি ১ থেকে ১০০০-এর মধ্যে যেকোনও ভ্যালুতে এটি সেট করতে পারবেন:
const {onRequest} = require("firebase-functions/v2/https");
exports.date = onRequest({
// set concurrency value
concurrency: 500
},
(req, res) => {
// ...
});
কনকারেন্সি টিউন করলে পারফর্ম্যান্স উন্নত হতে পারে এবং ফাংশনের খরচ কমতে পারে। একসাথে একাধিক অনুরোধের অনুমতি দিন বিকল্পে গিয়ে কনকারেন্সি সম্পর্কে আরও জানুন।
গ্লোবাল ভেরিয়েবেলের ব্যবহার অডিট করুন
কনকারেন্সি মাথায় না রেখে লেখা ফার্স্ট জেনারেশন ফাংশন গ্লোবাল ভেরিয়েবেল ব্যবহার করতে পারে যা প্রতিটি অনুরোধে সেট ও রিড করা হয়। কনকারেন্সি চালু করা থাকলে এবং একটি ইনস্ট্যান্স একসাথে একাধিক অনুরোধ হ্যান্ডেল করা শুরু করলে, আপনার ফাংশনে সমস্যা দেখা দিতে পারে, কারণ কনকারেন্ট অনুরোধগুলি একই সাথে গ্লোবাল ভেরিয়েবেল সেট করা এবং পড়া শুরু করে।
আপগ্রেড করার সময়, আপনি ফাংশনের সিপিইউ gcf_gen1-এ সেট করতে পারেন এবং
concurrency ১-এ সেট করে ফার্স্ট জেনারেশনের আচরণ ফিরিয়ে আনতে পারেন:
const {onRequest} = require("firebase-functions/v2/https");
exports.date = onRequest({
// TEMPORARY FIX: remove concurrency
cpu: "gcf_gen1",
concurrency: 1
},
(req, res) => {
// ...
});
তবে, দীর্ঘমেয়াদী সমাধান হিসেবে এটি সাজেস্ট করা হয় না, কারণ এটি ২য় প্রজন্মের ফাংশনের পারফর্ম্যান্সের সুবিধাগুলি বাজেয়াপ্ত করে। পরিবর্তে, আপনার ফাংশনে গ্লোবাল ভেরিয়েবেলের ব্যবহার অডিট করুন এবং আপনি প্রস্তুত হলে এই সাময়িক সেটিংস সরিয়ে দিন।
নতুন ২য় জেনারেশন ফাংশনে ট্রাফিক মাইগ্রেট করুন
কোনও ফাংশনের অঞ্চল বা ট্রিগারের ধরন পরিবর্তন করার মতোই, আপনাকে ২য় জেনারেশন ফাংশনের একটি নতুন নাম দিতে হবে এবং ধীরে ধীরে ট্রাফিক এতে মাইগ্রেট করতে হবে।
একই নামে কোনও ফাংশনকে ফার্স্ট থেকে সেকেন্ড জেনারেশনে আপগ্রেড করা এবং firebase deploy রান করা
সম্ভব নয়। এটি করলে এই সমস্যা হবে:
Upgrading from GCFv1 to GCFv2 is not yet supported. Please delete your old function or wait for this feature to be ready.
আপনার ফাংশন যে ধরনের ট্রিগার ব্যবহার করে তার উপর মাইগ্রেশন স্ট্র্যাটেজি নির্ভর করে।
কল করা যায় এমন, টাস্ক কিউ এবং HTTP ট্রিগার মাইগ্রেট করা
এইসব ট্রিগার সরাসরি ইনভোক করা হয়। যেহেতু ২য় জেনারেশন ফাংশনের একটি নতুন নাম (এবং HTTP ট্রিগারের জন্য একটি নতুন URL) থাকবে, তাই আপনি ক্লায়েন্টদের আপডেট করে ট্রাফিক মাইগ্রেট করতে পারবেন।
- আপনার কোডে ফাংশনের নাম পরিবর্তন করুন (যেমন,
myCallable-এর নাম পরিবর্তন করেmyCallableV2করুন)। - ফাংশন ডিপ্লয় করুন। ফার্স্ট জেনারেশন ও সেকেন্ড জেনারেশন, দুটি ফাংশনই এখন চলছে।
- নতুন ২য় জেনারেশন ফাংশনের নাম বা URL-এ পয়েন্ট করতে আপনার ক্লায়েন্ট কোড বা কলার আপডেট করুন।
- সব ট্রাফিক নতুন ফাংশনে শিফট হয়ে গেলে, Firebase CLI-এর
firebase functions:deleteকমান্ড ব্যবহার করে ফার্স্ট জেনারেশন ফাংশন মুছে দিন।
ব্যাকগ্রাউন্ড ট্রিগার মাইগ্রেট করুন
ব্যাকগ্রাউন্ড ট্রিগার (যেমন Pub/Sub, Cloud Firestore এবং Cloud Storage ট্রিগার) আপনার প্রোজেক্টের ইভেন্টে সাড়া দেয়। ট্রানজিশন চলাকালীন কোনও ইভেন্ট মিস করা এড়াতে, আপনাকে সাময়িকভাবে ফার্স্ট জেনারেশন ও সেকেন্ড জেনারেশন ফাংশন পাশাপাশি চালাতে হবে।
ট্রানজিশন পিরিয়ড চলাকালীন, দুটি ফাংশনই একই ইভেন্টে ট্রিগার করবে। এর অর্থ হল, আপনার বিজনেস লজিক প্রতিটি ইভেন্টের জন্য দুবার করে রান করবে। এগিয়ে যাওয়ার আগে আপনার ফাংশন আইডেমপোটেন্ট কিনা তা নিশ্চিত করুন।
ফার্স্ট জেনারেশন ফাংশনের পাশাপাশি সেকেন্ড জেনারেশন ফাংশন যোগ করুন, আপনার কোডে আগে থেকে থাকা ফার্স্ট জেনারেশন ফাংশন রেখে দিন এবং একই ইভেন্ট সোর্স শোনার জন্য সেকেন্ড জেনারেশন ফাংশন যোগ করুন।
import * as functions from "firebase-functions/v1"; import { onMessagePublished } from "firebase-functions/v2/pubsub"; // --- Existing 1st gen function --- export const myPubSub = functions.pubsub.topic("my-topic").onPublish((message, context) => { console.log("V1 handler running for event:", context.eventId); // ... existing v1 function logic ... }); // --- New v2 passthrough function --- export const myPubSubV2 = onMessagePublished("my-topic", async ({ message, context }) => { console.log("v2 handler triggering V1 for event:", context.eventId); // Call the v1 function's handler await myPubSub.run(message, context); });firebase deployরান করুন। দুটি ফাংশনই এখন অ্যাক্টিভ এবং একই ইভেন্ট শুনছে।২য় জেনারেশন ফাংশন ট্রাফিক পাচ্ছে কিনা তা যাচাই করুন। দুটি ফাংশনের জন্যই লগ মনিটর করুন। সব ইভেন্টের জন্য ২য় জেনারেশন ফাংশন চালু করা হয়েছে এবং কল সফলভাবে করা যাচ্ছে কিনা তা নিশ্চিত করুন।
ফাংশনটি সঠিকভাবে কাজ করছে বলে আপনি নিশ্চিত হলে, আসল বিজনেস লজিকটি ফার্স্ট জেনারেশন ফাংশন থেকে সেকেন্ড জেনারেশন ফাংশনের বডিতে সরান। আপনি পাসথ্রু পদ্ধতি ব্যবহার করলে,
myPubSub.run()-এ কল করার বিকল্পটি সরিয়ে দিন।import * as functions from "firebase-functions/v1"; import { onMessagePublished } from "firebase-functions/v2/pubsub"; // --- Existing v1 function (to be removed next) --- export const myPubSub = functions.pubsub.topic("my-topic").onPublish((message, context) => { console.log("v1 handler running for event:", context.eventId); // ... existing v1 function logic ... }); // --- New v2 function with full logic --- export const myPubSubV2 = onMessagePublished("my-topic", ({ message, context }) => { console.log("v2 handler running for event:", context.eventId); // ... existing v1 function logic WAS MOVED HERE ... });এই পরিবর্তন ডিপ্লয় করুন।
আপনার কোড থেকে ফার্স্ট জেনারেশন ফাংশন ডেফিনেশন সরিয়ে দিন এবং আবার ডিপ্লয় করুন। CLI আপনাকে Google Cloud থেকে ফার্স্ট জেনারেশন ফাংশন মুছে দেওয়ার জন্য প্রম্পট করবে।