Express.js 中空日期参数返回不正确的 JSON 对象

问题描述 投票:0回答:1

我目前正在开发 FreeCodeCamp Timestamp Microservice 项目,并且在实施过程中遇到了问题。虽然大多数要求都成功通过,但我在处理空日期参数的测试用例方面遇到了麻烦。具体如下:

通过测试:

  • 对 /api/:date 的请求?具有有效日期会返回带有 unix 和 utc 键的 JSON 对象。
  • 对 /api/1451001600000 的请求返回正确的时间戳。
  • 该项目可以处理通过 new Date(date_string) 解析的日期。
  • 无效的日期字符串返回 { error: "Invalid Date" }.

失败的测试:

  • 空日期参数应返回带有 unix 键的 JSON 对象中的当前时间。
  • 空日期参数应返回带有 utc 键的 JSON 对象中的当前时间。 这是我正在使用的代码:
// index.js
// where your node app starts

// init project
var express = require('express');
var app = express();
dotenv = require('dotenv');
dotenv.config();

// enable CORS (https://en.wikipedia.org/wiki/Cross-origin_resource_sharing)
// so that your API is remotely testable by FCC 
var cors = require('cors');
app.use(cors({ optionsSuccessStatus: 200 }));  // some legacy browsers choke on 204

// http://expressjs.com/en/starter/static-files.html
app.use(express.static('public'));

// http://expressjs.com/en/starter/basic-routing.html
app.get("/", function (req, res) {
  res.sendFile(__dirname + '/views/index.html');
});

const isInvalidDate = (date) => date.toUTCString() === "Invalid Date"

// your first API endpoint... 
app.get("/api/:date", function (req, res) {
  let date = new Date(req.params.date)

  if (isInvalidDate(date)) {
    date = new Date(+req.params.date)
  }

  if (isInvalidDate(date)) {
    res.json({ error: "Invalid Date" })
    return;
  }

  res.json({
    unix: date.getTime(),
    utc: date.toUTCString()
  });
});

app.get("/api", (req, res) => {
  res.json({
    unix: new Date().getTime(),
    utc: new Date().toUTCString()
  })
})



// listen for requests :)
var listener = app.listen(process.env.PORT, function () {
  console.log('Your app is listening on port ' + listener.address().port);
});

我期望当向 /api//api 发出请求时,服务器将以 Unix 和 UTC 格式作为 JSON 对象返回当前时间。

javascript node.js json api express
1个回答
0
投票

首先,您需要将空日期参数

(/api)
的路由放置在带有日期参数
(/api/:date)
的路由之前,其次,对于
date
问题,您需要为空
date
参数添加适当的处理。

// index.js
// where your node app starts

// init project
var express = require('express');
var app = express();
dotenv = require('dotenv');
dotenv.config();

// enable CORS (https://en.wikipedia.org/wiki/Cross-origin_resource_sharing)
// so that your API is remotely testable by FCC 
var cors = require('cors');
app.use(cors({ optionsSuccessStatus: 200 }));  // some legacy browsers choke on 204

// http://expressjs.com/en/starter/static-files.html
app.use(express.static('public'));

// http://expressjs.com/en/starter/basic-routing.html
app.get("/", function (req, res) {
  res.sendFile(__dirname + '/views/index.html');
});

const isInvalidDate = (date) => date.toUTCString() === "Invalid Date"

// your first API endpoint... 
app.get("/api", (req, res) => {
  const currentDate = new Date();
  res.json({
    unix: currentDate.getTime(),
    utc: currentDate.toUTCString()
  });
});

app.get("/api/:date", function (req, res) {
  let date = req.params.date;

  // Handle an empty date parameter
  if (!date) {
    date = new Date();
  } else {
    date = new Date(isNaN(date) ? date : parseInt(date));
  }

  if (isInvalidDate(date)) {
    res.json({ error: "Invalid Date" });
    return;
  }

  res.json({
    unix: date.getTime(),
    utc: date.toUTCString()
  });
});

// listen for requests :)
var listener = app.listen(process.env.PORT, function () {
  console.log('Your app is listening on port ' + listener.address().port);
});

© www.soinside.com 2019 - 2024. All rights reserved.