अधिक विशेष रूप से वर्णन करने के लिए नई सामग्री

मैं उन्नत रूटिंग के लिए एक्सप्रेस और फायरबेस फ़ंक्शन का उपयोग करने का प्रयास कर रहा हूं।

लेकिन जब मैं अपना फायरबेस क्लाउड फ़ंक्शन प्राप्त करने का प्रयास कर रहा हूं तो मुझे यह त्रुटि मिली है

लेखन त्रुटि: /उपयोगकर्ताओं/fredriccliver/Projects/firebase-test/functions/node_modules/express/lib/router/index.js:635:15 पर अपरिभाषित की संपत्ति 'लागू' नहीं पढ़ सकता (/Users/fredriccliver/Projects/firebase) -टेस्ट/फ़ंक्शंस/नोड_मॉड्यूल्स/एक्सप्रेस/लिब/राउटर/इंडेक्स.जेएस:260:14) फंक्शन.हैंडल पर (/उपयोगकर्ता/फ़्रेड्रिक्लिवर/प्रोजेक्ट्स/फ़ायरबेस-टेस्ट/फ़ंक्शंस/नोड_मॉड्यूल्स/एक्सप्रेस/लिब/राउटर/इंडेक्स.जेएस :174:3) राउटर पर (/Users/fredriccliver/Projects/firebase-test/functions/node_modules/express/lib/router/index.js:47:12) at /usr/local/lib/node_modules/firebase-tools /lib/emulator/functionsEmulatorRuntime.js:593:20 at /usr/local/lib/node_modules/firebase-tools/lib/emulator/functionsEmulatorRuntime.js:568:19 at Generator.next () at /usr/local/lib /node_modules/firebase-tools/lib/emulator/functionsEmulatorRuntime.js:8:71 नए प्रॉमिस () पर __awaiter (/usr/local/lib/node_modules/firebase-tools/lib/emulator/functionsEmulatorRuntime.js:4:12 पर) )

/functions/index.js

const functions = require("firebase-functions")
const admin = require("firebase-admin")
const cors = require("cors")
const express = require("express")
const apiRoute = require("./api")

// admin.initializeApp(functions.config().firebase)

const app = express()
app.use(cors)

app.use("/api", apiRoute)

exports.api = functions.https.onRequest(apiRoute)

/functions/api.js

const router = require("express").Router()

router.get("/data", (req, res) => {
  res.send(`this is data`)
})

module.exports = router

क्या कोई मुझे इस समस्या को हल करने के लिए कोई सुराग दे सकता है?


पिछली सामग्री

मैं अपने नोड (एक्सप्रेस के साथ) प्रोजेक्ट को फायरबेस संगत में बदलने की कोशिश कर रहा हूं।

मैं अपना एपीआई एंडपॉइंट /functions/index.js . में जोड़ता हूं

const apiRoute = require("./routes/api")
exports.api = functions.https.onRequest(apiRoute)

और मेरे api.js . में

router.get("/", (req, res) => {
  res.send("api is running on")
})

router.get("/sentences", (req, res) => {
  res.send("hi")
})

इसलिए, मेरी अपेक्षा यह थी कि जब मैं localhost:5000/api या localhost:5000/api/sentences पर कॉल करता हूं, तो मुझे एक प्रतिक्रिया मिल सकती है, लेकिन यह काम नहीं करता है।

उसके लिए, मैंने .onRequest का उपयोग करने के बजाय अपने क्लाउड फ़ंक्शन को सबमिट करने के लिए .onCall की कोशिश की।

लेकिन जब मैंने functions.httpsCallable("endpoint") को कॉल किया तो केवल POST अनुरोध स्वीकार किया गया था।

इसलिए, मैंने firebase.json में होस्टिंग में onRequest और पुनर्लेखन का उपयोग करने का प्रयास किया

"hosting": {
    "public": "public",
    "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
    "rewrites": [
      {
        "source": "/api/**",
        "function": "api"
      }
    ]
  },

लेकिन, मुझे अभी यह त्रुटि मिली है:

लेखन त्रुटि: /उपयोगकर्ताओं/fredriccliver/Projects/Speech/functions/node_modules/express/lib/router/index.js:635:15 पर अपरिभाषित की संपत्ति 'लागू' नहीं पढ़ सकता

मुझे अपने कार्यों को फ्रंटएंड जावास्क्रिप्ट से कॉल करने का तरीका कैसे लेना चाहिए?

0
Fredric Cliver 9 सितंबर 2020, 14:24

2 जवाब

सबसे बढ़िया उत्तर

मैंने एक यूट्यूब क्लिप की जांच करने और कुछ और कोशिश करने के बाद हल किया।

मेरी मध्यम पोस्ट पर संक्षेप में। https ://medium.com/@fredriccliver/how-to-use-an-express-router-within-the-cloud-function-Developing-environment-cb64face4043

कार्य/index.js

const functions = require("firebase-functions")
const express = require("express")
const app = express()

// my routings
const apiRoute = require("./api")

// add routes to the express app.
app.use("/api", apiRoute)

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

कार्य/api.js

const router = require("express").Router()

router.get("/api/user/data", (req, res) => {
  res.send(`this is /api/user/data`)
})

router.get("/api/data", (req, res) => {
  res.send(`this is /api/data`)
})

router.get("/api/api", (req, res) => {
  res.send(`here is /api/api`)
})

router.get("/api", (req, res) => {
  res.send(`here is /api`)
})

router.get("/data", (req, res) => {
  res.send(`here is /data`)
})

router.get("/", (req, res) => {
  res.send(`here is /`)
})

module.exports = router

/firebase.json


{
  "hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [{
      "source": "/api/**",
      "function": "api"
    }]
  }
}

इसलिए, मैं सभी अंतिम बिंदुओं तक पहुंच सकता हूं

0
Fredric Cliver 10 सितंबर 2020, 16:57

आपके मार्गों में फायरबेस होस्टिंग से प्रॉक्सी किए गए यूआरआई का पूरा पथ शामिल होना चाहिए।

router.get("/api", (req, res) => {
  res.send("api is running on")
})

router.get("/api/sentences", (req, res) => {
  res.send("hi")
})

मेरा मानना ​​है कि आप प्रत्येक के लिए एक सामान्य उपसर्ग निर्दिष्ट करने के लिए use() का भी उपयोग कर सकते हैं ऐप में रूट।

2
Doug Stevenson 9 सितंबर 2020, 19:00