当用户访问时,我正在尝试使用firebase取消缩短缩短的URL:
myapp.firebaseappurl.com/url/SHORTENEDLINK
所以不要让我添加缩短的网址
我希望输出为:
{
"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
答案 0 :(得分:3)
您看到Error: could not handle the request
,因为可能存在异常并且超时。
使用以下方法检查您的日志:
firebase functions:log
有关详细信息,请参阅docs
以下是我如何让网址不变的工作
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
请求查看标题的“位置”字段,并确定该网址是否可以进一步缩短。
这更轻,因为HEAD请求不要求身体(从而避免身体解析)。此外,不需要第三方库!
另请注意,url作为查询参数传递。所以请求将是
http://<your_firebase_server>/url?url=<short_url>
为您省去URL重写的麻烦。加上语义上更有意义。
答案 1 :(得分:2)
您是否尝试过使用{ source: '/url/**' }
语法?
你可以使用这样的东西;
{
"hosting": {
"public": "public",
"rewrites": [ {
"source": "/url/**",
"function": "/url"
}]
}
}
然后您可以解析请求中的网址。
exports.url = functions.https.onRequest((req, res) => {
// parse the url from the req and redirect to the correct link
});
答案 2 :(得分:1)
您应该在firebase.json中尝试一下,它对我有用:
"source": "/**",
我也尝试过"source": "/url/**"
,但是没有用。
答案 3 :(得分:0)
我认为您的代码很好。您错误的做法是,您在firebase.json
的{{1}}节点中使用Express-js符号。 (rewrites
部分)。这些不在Firebase实时数据库中工作。
所以,不要这样做,而是将:item
更改为以下内容: -
firebase.json
这也是 Firebase云端功能的网址缩短sample中提倡的方法。
答案 4 :(得分:0)
首先确保您使用缩短的网址正确接收请求。
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
使用--save
也是一种很好的做法,因此它们最终会出现在packages.json
中。虽然firebase会复制您的node_modules文件夹,但大多数其他SaaS平台都会运行npm install
。