髪を引き抜くような気がします。これは非常に単純で、脳がフリーズするか、それほど単純ではありません。
ユーザーが以下にアクセスしたときに、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
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は意味的にもう少し理にかなっています。
{ 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
});
あなたはfirebase.jsonでこれを試してみてください、それは私のために働いた:
"source": "/**",
私も試してみました"source": "/url/**"
しかし、機能していません。
最初に、短縮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
。
あなたのコードは問題ないと思います。間違ってしているのは、firebase.json
のrewrites
ノード。 (:item
part)。これらはFirebase Realtime Databaseでは機能しません。
そのため、それを行う代わりに、firebase.json
次へ:-
{
"hosting": {
"public": "public",
"rewrites": {
"source": "YOUR SHORTENED URL",
"destination": "YOUR ORIGINAL URL"
}
}
}
これは、Firebaseのクラウド機能のURL Shortener sample で提唱されているアプローチでもあります。