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

Posted

技术标签:

【中文标题】Firebase 的云功能:“错误:无法处理请求”【英文标题】:Cloud Functions for Firebase: 'Error: could not handle the request' 【发布时间】:2018-01-17 21:58:00 【问题描述】:

我想拔头发;这要么超级简单,我脑子都冻僵了,要么没那么简单。

我想要什么

当用户转到:myapp.firebaseappurl.com/url/SHORTENEDLINKSO 不允许我添加缩短的 URL

我希望输出是:


  "url": "https://***.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

【问题讨论】:

在请求中添加method : 'POST' 为什么?传递的参数在 URL 中,所以是 GET 请求吧? @mohamadrabee - 另外,只是试了一下,看看是不是这样。没有。没用。 对不起我的错误 你能分享你的 package.json 吗?您是否在依赖项中有“请求” 【参考方案1】:

您看到的是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 请求不要求正文(从而避免正文解析)。此外,不需要第三方库!

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

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

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

【讨论】:

我认为需要重写以告诉我的 Firebase 托管根据哪个 url 运行哪个函数? 试试这个us-central1-helloworld-9d223.cloudfunctions.net/… url> @JamesG 您有机会尝试解决方案吗?【参考方案2】:

您是否尝试过使用 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
 );

【讨论】:

【参考方案3】:

你应该在 firebase.json 中试试这个,它对我有用:

"source": "/**",

我也试过"source": "/url/**",但没用。

【讨论】:

【参考方案4】:

我认为您的代码很好。您做错了什么是您在firebase.jsonrewrites 节点中使用了Express-js 符号。 (:item 部分)。这些在 Firebase 实时数据库中不起作用。

所以,不要这样做,而是将您的 firebase.json 更改为以下内容:-

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

这也是 Cloud Functions for Firebase 的 URL Shortener sample 中提倡的方法。

【讨论】:

这不是动态的。我希望能够将 url 作为参数传递给函数。有什么想法吗? @Rohan 该示例仅适用于 goo.gl 网址。此外,可以使用比 GET 更轻量级的 HEAD 请求来完成 url 解析 @JamesG 是的,它不会是动态的。但是,只要缩短原始 URL,您就可以将其简单地保存在您指定的位置。对于访问原始 URL,您只需在 Cloud 函数文件中添加代码,以便在 HTTP 触发期间从指定位置读取它,并将其用作响应的 URL。这当然不会是动态的。但是,您不必即时取消缩短网址,也不必包含第三方应用程序。【参考方案5】:

首先确保您使用缩短的 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--save 也是一个很好的做法,因此它们最终会出现在 packages.json 中。当 firebase 复制您的 node_modules 文件夹时,大多数其他 SaaS 平台运行 npm install

【讨论】:

以上是关于Firebase 的云功能:“错误:无法处理请求”的主要内容,如果未能解决你的问题,请参考以下文章

防止滥用:Firebase 的云功能

Firebase 的云功能 - 即使我正在为 firebase-admin 功能发出出站 http 请求,也会出现网络错误

Firebase 的云功能 - 获取当前用户 ID [重复]

如何从 Firebase Cloud 功能中提取已部署的云功能 [重复]

javascript 用于连接DialogFlow和Firebase实时数据库的云功能

Firebase 的云功能 - getaddrinfo EAI_GAIN site.com:443 [重复]