如何通过Node.js将日期输入值存入MongoDB?任务管理器项目技术求助
解决你的Node.js任务管理器日期字段问题
嘿Bram!你已经精准定位到了两个核心问题的方向,咱们一步步把这些问题理顺,让你的日期功能正常跑起来:
1. 先修复日期输入值的获取错误
你现在的代码里犯了一个小疏忽——获取日期值的时候,用的是任务名称输入框的DOM元素,导致日期和任务名称完全一样。咱们给日期输入框单独创建一个DOM选择器:
首先在script开头添加:
const dateInputDOM = document.querySelector('input[name="date"]');
然后在表单提交的事件监听里,把日期值的获取改成:
const name = taskInputDOM.value; const date = dateInputDOM.value; // 这里现在用的是专门的日期输入框
这样就能正确拿到用户选择的日期了。
2. 处理日期类型的转换与Schema配置
修正Mongoose Schema的必填项设置
你的Schema里date字段的required配置写反了:
date: { type: Date, required: [false, "A task must have a date."], // 这里有问题 },
如果日期是应用必不可少的(你提到日程展示需要),应该把required设为true,错误提示才有用;如果是可选的,直接写required: false就行,不需要数组格式。修正后:
date: { type: Date, required: [true, "A task must have a date."], // 现在是必填,符合你的需求 },
日期字符串转Date类型
浏览器的input[type="date"]返回的是YYYY-MM-DD格式的字符串,Mongoose的Date类型通常可以自动解析这种字符串,但为了避免时区或者解析异常,你可以在前端把字符串转成Date对象再发送:
// 提交时把日期字符串转成Date const date = new Date(dateInputDOM.value);
或者在后端的路由处理里,把接收的date字符串转成Date类型,两种方式都可以,前端处理更直接。
3. 在前端渲染任务时显示日期
你当前的showTasks函数里,渲染任务的模板没有包含日期字段,咱们把它加上,还可以格式化一下让日期更友好:
const allTasks = tasks .map((task) => { const { completed, _id: taskID, name, date } = task; // 格式化日期为本地格式,比如"2024/5/20" const formattedDate = new Date(date).toLocaleDateString(); return `<div class="single-task ${completed && "task-completed"}"> <h5><span><i class="far fa-check-circle"></i></span>${name}</h5> <p class="task-date">截止日期:${formattedDate}</p> <div class="task-links"> <!-- 这里保留你原来的编辑/删除按钮逻辑 --> </div> </div>`; }) .join(""); // 别忘了join,不然会返回数组的逗号分隔符 tasksDOM.innerHTML = allTasks; // 还要把渲染的内容赋值给tasksDOM,你原来的代码漏了这一步!
注意:你原来的showTasks函数里,生成allTasks后没有把它赋值给tasksDOM.innerHTML,这也是任务没显示的一个小问题,上面的代码补上了。
最后测试验证
做完这些修改后:
- 打开Chrome控制台的网络标签页,提交任务时看POST请求的payload,确认
name和date是正确的不同值 - 去MongoDB数据库里查看任务文档,确认
date字段是Date类型而不是字符串 - 刷新页面,应该能看到带日期的任务列表了
这样你的日期功能就能正常工作啦,祝你顺利完成这个任务管理器项目!
内容的提问来源于stack exchange,提问作者Bram Kuitert
相关产品推荐
相关产品推荐

