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

新手上路,请多包涵

我想把头发拉出来;这要么超级简单,我的大脑冻结了,要么没那么简单。

我想要的是

当用户转到以下位置时,我正在尝试使用 Firebase 缩短缩短的 URL:

myapp.firebaseappurl.com/url/SHORTENEDLINK

所以不会让我添加缩短的 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

原文由 JamesG 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 605
1 个回答

您看到的是 Error: could not handle the request 因为可能出现异常并且超时。

使用以下命令检查您的日志:

 firebase functions:log

有关更多详细信息,请参阅 文档

这是我如何让 URL unshortening 工作

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 请求不要求任何主体(从而避免主体解析)。此外,不需要第三方库!

另请注意,url 作为查询参数传递。所以要求是

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

省去了重写 URL 的麻烦。另外在语义上更有意义。

原文由 user2065736 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题