web-dev-qa-db-ja.com

Firebaseのクラウド機能:「エラー:リクエストを処理できませんでした」

髪を引き抜くような気がします。これは非常に単純で、脳がフリーズするか、それほど単純ではありません。

私が欲しいもの

ユーザーが以下にアクセスしたときに、firebaseを使用して短縮URLの短縮を解除しようとしています。
myapp.firebaseappurl.com/url/SHORTENEDLINK
SOで短縮URLを追加することはできません

出力を次のようにします。

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

私が試したこと

firebase.jsonファイル:

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

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);
      }
    );

});

結果

myapp.firebaseappurl.com/url/SHORTENEDLINKにアクセスすると、次の結果が得られます。

Error: could not handle the request
14
JamesG

Error: could not handle the requestおそらく例外があり、タイムアウトしたためです。

以下を使用してログを確認します。

firebase functions:log

詳細については、 docs を参照してください

URL短縮を機能させる方法は次のとおりです。

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 });
    }
  });
});

Hello worldの例をすぐにたどり、上記のコードをfunctionとして使用できます。

上記のコードは、HEADリクエストを使用してヘッダーの 'Location`フィールドを覗き、URLをさらに短縮できるかどうかを決定します。

HEADリクエストはボディを要求しないため(ボディ解析を回避します)。また、サードパーティのlibは必要ありません!

また、URLがクエリパラメータとして渡されることにも注意してください。したがって、要求は

http://<your_firebase_server>/url?url=<short_url>

URLの書き換えの手間を省きます。 Plusは意味的にもう少し理にかなっています。

6
Manas Jayanth

{ source: '/url/**' }構文を使用してみましたか?

このようなものを使用できます。

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

その後、リクエストからURLを解析できます。

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

あなたはfirebase.jsonでこれを試してみてください、それは私のために働いた:

"source": "/**",

私も試してみました"source": "/url/**"しかし、機能していません。

1

最初に、短縮URLを使用してリクエストを適切に受信していることを確認します。

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);

Myapp.firebaseappurl.com/url/SHORTENEDLINKにアクセスすると、SHORTENEDLINKがプレーンテキストで表示されます。それが機能したら、リダイレクトを試してください。

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);

また、npm install with --saveしたがって、それらはpackages.json。 firebaseはnode_modulesフォルダーをコピーしますが、他のほとんどのSaaSプラットフォームはnpm install

0

あなたのコードは問題ないと思います。間違ってしているのは、firebase.jsonrewritesノード。 (:item part)。これらはFirebase Realtime Databaseでは機能しません。

そのため、それを行う代わりに、firebase.json次へ:-

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

これは、Firebaseのクラウド機能のURL Shortener sample で提唱されているアプローチでもあります。

0
Rohan Stark