express - डायनेमिक क्लाउड फ़ॉर्म्स के साथ फायरबेज होस्टिंग फिर से लिखता है



firebase google-cloud-functions (1)

मुख्य मुद्दा यह है कि यह क्या है:

{
    "source": "/api",
    "function": "api"
}

वास्तव में https://my-firebase-app.cloudfunctions.net/api/api फिर से लिखना https://my-firebase-app.cloudfunctions.net/api/api बजाय आपको उम्मीद थी। सूचना कैसे api दोहराया है

इसका मेरा समाधान main फ़ंक्शन बनाने के लिए है, जो अन्य सभी शीर्ष-स्तरीय कार्यों को होस्ट करता है:

const functions = require('firebase-functions');
const express = require('express');
const app = express();

app.get('/users/:userId/:userData/json', (req, res) => {
    // Do App stuff here
}
// A couple more app.get in the same format

// Create "main" function to host all other top-level functions
const main = express();
main.use('/api', app);

exports.main = functions.https.onRequest(main);

अब आप अपने यूआरएल संरचना को तोड़ने के बिना अन्य सभी कार्यों को सौंपने के लिए इस main फ़ंक्शन का उपयोग कर सकते हैं:

{
    "source": "/api/**", // "**" ensures we include paths such as "/api/users/:userId"
    "function": "main"
}

और वोला! अब आप https://my-app.firebaseapp.com/api/users/:userId/:userData माध्यम से सभी api फंक्शन कॉल्स तक पहुंच सकते हैं जैसे आप अपेक्षा करते हैं।

इस समापन बिंदु को कॉल करने से, अब https://my-firebase-app.cloudfunctions.net/main/api को पुनर्लेखित किया जाता है जो कि तकनीकी रूप से सही है यदि आप चाहें तो उन्हें अपने main फ़ंक्शन में जोड़ने के बाद आप अधिक शीर्ष-स्तरीय कार्य जोड़ सकते हैं:

const hooks = express();
main.use('/hooks/, hooks);

मेरे पास api नामक फ़ंक्शन में फायरबेज पर एक एक्सप्रेस.जेएस आधारित क्लाउड फ़ंक्शन एप है। कस्टम डोमेन का उपयोग करने के लिए, मैं फ़ंक्शन को विशिष्ट URL पर रूट करने के लिए Firebase होस्टिंग पुनर्लेखनों का उपयोग करने का प्रयास कर रहा हूं। मैं क्लाउड फ़ंक्शंस और फ़ायरबसे की मेजबानी के बारे में आधिकारिक दस्तावेज का अनुसरण कर रहा हूं, https://firebase.google.com/docs/hosting/functions , और निम्नलिखित सहित कई संयोजनों की कोशिश की है:

"rewrites": [
      {
        "source": "/api/**",
        "function": "api"
      }
    ]

"rewrites": [
      {
        "source": "/api/:path1/:dat1/dat",
        "function": "api/:path1/:dat1/dat"
      }
    ]
"rewrites": [
      {
        "source": "/api/path1/dat1/dat",
        "function": "api"
      }
    ]
"rewrites": [
      {
        "source": "/api/*/*/*",
        "function": "api"
      }
    ]

अफसोस की बात है, यह किसी भी संभव संयोजन के लिए काम करने के लिए नहीं लगता है। मेरे एक्सप्रेस ऐप में निम्नलिखित GET पथ हैं जिनका उपयोग मैं योजना पर करता हूं:

'/api/users/:userId/:userData'
'/api/users/:userId/:userData/json'
'/api/users/:userId/'

और इन के समान अन्य। : userId और: userData मेरे अनुरोध में पैरामीटर हैं, क्योंकि यह express.js के साथ काम करता है

अपेक्षित कार्यों में काम के रूप में उम्मीद है

https://my-firebase-app.cloudfunctions.net

लेकिन वे साथ काम नहीं करते

https://my-app.firebaseapp.com

कृपया मुझे बताएं कि ये कैसे काम करना चाहिए और मैं गलत क्या कर रहा हूं।

संपादित करें: यहां एक नमूना है जो मेरा क्लाउड फ़ंक्शन निर्यात करता है जैसे दिखता है

const functions = require('firebase-functions');
const express = require('express');
const app = express();

app.get('/users/:userId/:userData/json', (req, res) => {
    // Do App stuff here
}
// A couple more app.get in the same format

exports.api = functions.https.onRequest(app);

2 संपादित करें: @ डॉग स्टीवेंसन के सुझाव के बाद, मैंने निम्नलिखित कॉन्फ़िगरेशन की कोशिश की

मैं अपने firebase.json में निम्नलिखित की कोशिश की,

{
  "hosting": {
    "rewrites": [
      {
        "source": "/api",
        "function": "api"
      }
    ],
    "public": "public"
  }
}

लेकिन मुझे एक ही समस्या है, फ़ंक्शन कभी भी नहीं कहा जाता है। मैंने पढ़ा है कि कैसे पुनर्लेखन आखिरी विकल्प हैं और अगर मेजबानी में मौजूद फाइलें हैं, तो यह विशिष्ट फ़ंक्शन पर नहीं जाएंगी। (मैंने ऐसे पदों की तलाश करने की कोशिश की जहां यह उल्लेख किया गया था लेकिन मैं इसे नहीं खोज सकता) तो मैंने होस्टिंग की सार्वजनिक निर्देशिका से 404.html और index.html फ़ाइलों को हटा दिया है, क्योंकि मुझे उन्हें वैसे भी ज़रूरत नहीं है लेकिन समस्या अभी भी बनी रही

2 संपादित करें: ठीक है, बहुत सारे मुकदमा और त्रुटि के बाद, मुझे निम्न स्वरूप में कठोर कोड का पथ था:

rewrites : [
      {
        "source": "/users/**/**/json",
        "function": "api"
      },
      {
        "source": "/api/users/**/**/json",
        "function": "api"
      }
]

इसके बाद, एक्सप्रेस एप्लिकेशन इस तरह से कुछ कॉन्फ़िगर किया गया है:

app.get('/users/:userId/:userData/json', Foo)

मैं अभी भी पसंद करता है अगर किसी ने मैन्युअल रूप से होस्टिंग पुनर्लेखनों में प्रत्येक आवश्यक उरी में डालने के बजाय इसे पूरा करने का बेहतर तरीका सुझाया।