Mongoose查询在Postman正常,Cyclic/Railway服务器返回空数组求助
问题解决:Express部署后日期查询返回空数组
核心原因
本地与服务器的时区不一致,导致Moment生成的当日起止时间范围,和数据库中RDate字段的实际时间没有重叠,因此查询返回空数组。
解决方案
1. 统一时区生成查询时间
如果数据库中的RDate是按UTC存储的,直接用UTC时区生成当日范围:
const express=require('express'); const router=express.Router(); const Pokaranreading=require('../model/pokaranschema'); const moment = require('moment'); router.get('/todaydata',async (req,res)=>{ try { // 用UTC时区生成当日起止时间 const startOfToday=moment.utc().startOf('day').toDate(); const endOfToday=moment.utc().endOf('day').toDate(); const Pokreading=await Pokaranreading.find({ RDate:{ $gte:startOfToday, $lte:endOfToday } }); res.status(200).json(Pokreading); // 注:查询成功用200状态码更规范 } catch (error) { res.status(500).json(error) // 注:服务器错误用500状态码更准确 } })
如果RDate是按特定时区(比如印度时区)存储的,先安装moment-timezone包:
npm install moment-timezone
再修改代码指定对应时区:
const moment = require('moment-timezone'); // ... const startOfToday=moment.tz('Asia/Kolkata').startOf('day').toDate(); const endOfToday=moment.tz('Asia/Kolkata').endOf('day').toDate();
2. 直接匹配日期部分(忽略时区)
如果不想处理时区,可以将数据库日期和当前日期转成字符串,只比较年月日部分:
router.get('/todaydata',async (req,res)=>{ try { const todayStr = moment().format("YYYY-MM-DD"); const Pokreading=await Pokaranreading.find({ $expr: { $eq: [{ $dateToString: { format: "%Y-%m-%d", date: "$RDate" } }, todayStr] } }); res.status(200).json(Pokreading); } catch (error) { res.status(500).json(error) } })
3. 检查数据库字段类型
确认Pokaranschema中RDate的类型是Date而非字符串,避免时区转换异常:
// pokaranschema.js示例 const mongoose = require('mongoose'); const pokaranSchema = new mongoose.Schema({ RDate: { type: Date, required: true }, // 其他字段... }); module.exports = mongoose.model('Pokaranreading', pokaranSchema);
内容的提问来源于stack exchange,提问作者Saurabh Gupta
相关产品推荐
相关产品推荐

