Funciones de la nube para Firebase: ‘Error: no se pudo manejar la solicitud’

Tengo ganas de sacarme el pelo; Esto es súper simple y estoy congelando mi cerebro o no es tan simple.

Lo que quiero

Estoy tratando de acortar una URL acortada usando firebase, cuando un usuario va a:
myapp.firebaseappurl.com/url/SHORTENEDLINK
Así que no me deja agregar una URL acortada

Me gustaría que la salida fuera:

 { "url": "https://stackoverflow.com/questions/45420989/sphinx-search-how-to-use-an-empty-before-match-and-after-match" } 

Lo que he intentado

archivo firebase.json :

 { "hosting": { "public": "public", "rewrites": [ { "source": "/url/:item", "destination": "/url/:item" } ] } } 

archivo index.js :

 const functions = require('firebase-functions'); exports.url = functions.https.onRequest((requested, response) => { var uri = requested.url; request({ uri: uri, followRedirect: true }, function(err, httpResponse) { if (err) { return console.error(err); } response.send(httpResponse.headers.location || uri); } ); }); 

Resultado

Cuando voy a myapp.firebaseappurl.com/url/SHORTENEDLINK obtengo lo siguiente:

 Error: could not handle the request 

¿Intentaste usar la syntax de { source: '/url/**' } ?

Puedes usar algo como esto;

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

y luego puede analizar la url de la solicitud.

  exports.url = functions.https.onRequest((req, res) => { // parse the url from the req and redirect to the correct link }); 

Está viendo Error: could not handle the request ya que probablemente hubo una excepción y se agotó el tiempo de espera.

Revise sus registros utilizando:

 firebase functions:log 

Consulte los documentos para más detalles.

Así es como conseguí que el URL se acortara para funcionar

 const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase); const http = require('http'); const urlP = require('url'); const unshorten = (url, cb) => { const _r = http.request( Object.assign( {}, urlP.parse(url), { method: 'HEAD', } ), function(response) { cb(null, response.headers.location || url); } ); _r.on('error', cb); _r.end(); }; const resolveShortUrl = (uri, cb) => { unshorten(uri, (err, longUrl) => { if (longUrl === uri) { cb(null, longUrl); } else { resolveShortUrl(longUrl, cb); } }); }; exports.url = functions.https.onRequest((requested, response) => { var uri = requested.query.url; resolveShortUrl(uri, (err, url) => { if (err) { // handle err } else { response.send({ url }); } }); }); 

Puede seguir el ejemplo de hello world de inmediato y usar el código anterior como su function .

El código anterior utiliza las solicitudes HEAD para echar un vistazo al campo ‘Ubicación’ de los encabezados y decide si la URL se puede acortar aún más.

Esto es más ligero ya que las solicitudes HEAD no solicitan ningún cuerpo (evitando así el análisis del cuerpo). Además, no se requiere la liberación de terceros!

También tenga en cuenta que la url pasó como un parámetro de consulta. Así que la solicitud sería

 http:///url?url= 

Le ahorra la molestia de reescrituras de URL. Además semánticamente tiene un poco más de sentido.

Creo que tu código está bien. Lo que está haciendo incorrectamente es que está usando notaciones Express-js en el nodo de rewrites firebase.json . (la :item parte del :item ). Estos no funcionan en la base de datos en tiempo real de Firebase.

Entonces, en lugar de hacer eso, cambie su firebase.json a lo siguiente: –

  { "hosting": { "public": "public", "rewrites": { "source": "YOUR SHORTENED URL", "destination": "YOUR ORIGINAL URL" } } } 

Este es también el enfoque recomendado en el ejemplo de Acortador de URL de Cloud Functions for Firebase .

Primero asegúrese de que está recibiendo la solicitud correctamente con la url acortada.

 const functions = require('firebase-functions'); const express = require('express'); var express_app = express(); express_app.use(body_parser.text({type: ()=>true})); express_app.all('*', (req, res) => { console.log(req.path); res.send(JSON.stringify(req.path)); }); exports.url = functions.https.onRequest(express_app); 

Ahora, cuando visite myapp.firebaseappurl.com/url/SHORTENEDLINK, debería ver SHORTENEDLINK en texto sin formato. Cuando eso funcione, intente la redirección.

 const functions = require('firebase-functions'); const express = require('express'); const request = require('request'); var express_app = express(); express_app.use(body_parser.text({type: ()=>true})); express_app.all('*', (req, res) => { var url = req.path; request({ uri: uri, followRedirect: true }, function(err, httpResponse) { if (err) { return console.error(err); } res.send(httpResponse.headers.location || uri); } ); }); exports.url = functions.https.onRequest(express_app); 

También es una buena práctica npm install --save con --save para que terminen en packages.json . Mientras que firebase copia su carpeta node_modules, la mayoría de las otras plataformas SaaS ejecutan npm install .