我正在尝试通过ajax呼叫进行搜索。
数据是具有开始和结束日期和字符串描述的事件。
我遇到的问题是,NodeJS路由器似乎没有接收Ajax调用中发送的标准。
这是代码:
mongoose模型
const eventSchema = new mongoose.Schema({
description: {
type: String,
require: true,
default: ""
},
beginDate: {
type: Date,
required: true,
default: Date.now
},
endDate: {
type: Date,
required: true,
default: Date.now
}
})
ajax调用
function showEvent(dateValue) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
var valResponse = JSON.parse(this.responseText)
var eventStart = new Date(valResponse.beginDate)
var eventEnd = new Date(valResponse.endDate)
document.getElementById("eventFrom").innerHTML = datetimeToText(eventStart)
document.getElementById("eventTo").innerHTML = datetimeToText(eventEnd)
document.getElementById("eventDesc").innerHTML = valResponse.description
}
};
xhttp.open("POST", "/getevent", true);
xhttp.setRequestHeader("Content-Type", "application/json;");
xhttp.send(JSON.stringify({ 'beginDate': { '$gte': '2019-05-23T00:00:00.000Z' }, 'endDate': { '$lte': '2019-05-23T23:59:59.000Z' } }))
}
nodejs路由器
const express = require("express")
const router = new express.Router()
const Event = require("../models/eventsModel")
router.post("/getevent", async (req, res) => {
try {
Event.find(req.body).exec((err, result) => {
res.status(200).send(result)
})
} catch (e) {
console.log(e)
res.status(400).send(e)
}
})
module.exports = router
现在,如果我在路由器中添加了console.log(req.body(,它只会返回一个空的json({}(。
欢迎任何帮助!
这是一个很好的例子,说明荒谬的错误如何使您损失编码时间!
我发布的代码中有两个错误:
1-在行xhttp.setrequestheader上(" content-type"," application/json;"(;报价中的分号不应该在那里。因此,正确的行是xhttp.setRequestheader(" content-type"," application/json"(;
2-发送的数据格式不佳:
而不是" Begindate":{'$ GTE':'2019-05-23T00:00:00.000Z'}必须开始:{gte:'2019-05-23T00:00:00.000z'}
在"启动"one_answers" gte"中引号阻止了nodejs作为标识符处理。GTE面前的$也是如此。有了这些引号,不可能使用req.body.begindate访问数据。
希望这些信息能够帮助其他人...