Express.js中空日期参数返回错误JSON对象问题排查
解决FreeCodeCamp时间戳微服务空参数测试失败问题
问题现状
已通过测试项:
- 向
/api/:date?传入有效日期,返回包含unix和utc键的JSON - 请求
/api/1451001600000返回正确时间戳 - 可处理
new Date(date_string)能解析的日期格式 - 传入无效日期字符串时返回
{ error: "Invalid Date" }
失败测试项:
- 空日期参数(请求
/api或/api/)应返回含unix键的当前时间JSON - 空日期参数(请求
/api或/api/)应返回含utc键的当前时间JSON
问题原因
当前代码中,/api/:date路由要求必须传入date参数,当请求/api/时,req.params.date会被设为空字符串,导致解析成无效日期,触发错误返回。而单独的/api路由只处理不带斜杠的请求,没覆盖/api/的情况,两种空参数场景未完全处理。
解决方案
修改路由规则,让date参数变为可选,同时在处理逻辑中判断参数是否为空,为空时返回当前时间。
修改后的代码
// index.js // where your node app starts // init project var express = require('express'); var app = express(); dotenv = require('dotenv'); dotenv.config(); // enable CORS var cors = require('cors'); app.use(cors({ optionsSuccessStatus: 200 })); // 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" // 修改路由,让date参数可选 app.get("/api/:date?", function (req, res) { // 处理空参数情况:参数不存在或为空字符串 if (!req.params.date) { const now = new Date(); return res.json({ unix: now.getTime(), utc: now.toUTCString() }); } 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() }); }); // listen for requests :) var listener = app.listen(process.env.PORT, function () { console.log('Your app is listening on port ' + listener.address().port); });
修改说明
- 路由改为
/api/:date?,问号表示date参数是可选的,这样/api和/api/都会匹配到这个路由。 - 在处理逻辑开头添加判断:如果
req.params.date不存在或为空,直接返回当前时间的JSON。 - 删除原来单独的
/api路由,避免路由冲突,同时简化代码结构。
这样修改后,空参数的两个测试项就能通过,同时不影响其他已通过的测试。
内容的提问来源于stack exchange,提问作者Kernel-rb
相关产品推荐
相关产品推荐

