400错误请求将/favicon.ico作为req.url返回快递。

时间:2018-05-04 15:42:01

标签: node.js http express backend http-status-code-400

我正在构建一个简单的微服务,它将url日期参数作为json对象以unix和自然语言返回。例如,如果你去 https://cyber-clock.glitch.me/May%2013,%202015 该应用应返回: {“unix”:1431475200,“自然”:“2015年5月13日”} , %20是空格,所以你也可以写 https://cyber-clock.glitch.me/May 2015年第13期 和应用程序工作。 问题是当我写一个双百分比因为我收到400错误请求错误并且网址变为: /favicon.ico ,所以我无法按预期将修复应用于网址和响应,例如: https://cyber-clock.glitch.me/May%%2013,%202015

您可以在此处查看源代码:https://github.com/juandata/TimeStampMicroService

在timeStampMicroService.js的第22行,我添加了一个console.log,你可以看到我的意思。这是该文件的代码:

var path = require('path')
var express = require('express');
var app = express();
var fs = require('fs');
var url = require('url');
var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
  jsonResp = {},
  readableDate = "";
function Unix_timestamp(t) {
  var dt = new Date(t * 1000);
  var month = dt.getMonth();
  var day = dt.getDate();
  var year = dt.getFullYear();
  return months[month] + ' ' + day + ', ' + year;
};  
app.use(function(req, res, next) {
  console.log(req.url);
  var date = req.url.substr(1);
  var miliseconds = parseInt(date);
  var unixDate = new Date(miliseconds);
  if (unixDate == "Invalid Date") {
    var regExpr = /%20|,/;
    date = date.split(regExpr);
    var date1 = new Date(date[0] + " " + date[1] + "," + date[3]);
    if (date1 == "Invalid Date") {
      jsonResp = {
        "unix": null,
        "natural": null
      };
      res.json(jsonResp);

    } else {
      var date2 = date1.getTime();
      var timestamp = Math.floor(date2 / 1000);
      jsonResp = {
        "unix": timestamp,
        "natural": date[0] + " " + date[1] + ", " + date[3]
      };
      res.json(jsonResp);
    }
  } else {
    readableDate = Unix_timestamp(date);
    jsonResp = {
      "unix": miliseconds,
      "natural": readableDate
    };

    res.json(jsonResp);
  }
});
app.listen(process.env.PORT, function() {
  console.log('Node.js listening ...');
});

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

这可能发生是因为服务器正在尝试解码百分比编码字符并发现格式错误 - 您将%放在另一个之后,但百分比编码字符如下所示:{{1} },其中H是十六进制数字,请查看:https://tools.ietf.org/html/rfc3986#section-2.1

因此,即使在您的应用获取网址之前,也必须发生错误。只是不要试图通过这样的网址。如果您想制作一个包含百分比字符的网址,请使用%HH,例如:https://cyber-clock.glitch.me/May%25%2013,%202015

如果你想处理这样的URI,你可能需要实现自己的HTTP服务器(HTTP请求处理程序)。