You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:16:21