Firebase的云功能:'错误:无法处理请求'

时间:2017-08-09 20:46:35

标签: node.js firebase google-cloud-functions firebase-hosting url-shortener

我想把头发拉出来;这要么是超级简单,要么是大脑冻结,要么就是这么简单。

我想要什么

当用户访问时,我正在尝试使用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

5 个答案:

答案 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