使用NodeJS从AJAX调用中搜索MongoDB

时间:2019-05-19 20:35:05

标签: javascript node.js ajax mongoose

我正在尝试通过AJAX调用在MongoDB数据库中进行搜索。

数据是具有开始和结束日期时间以及字符串描述的事件。

我遇到的问题是,nodejs路由器似乎没有收到ajax调用中发送的条件。

代码如下:

猫鼬模型

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 个答案:

答案 0 :(得分:0)

这是一个很好的例子,说明荒谬的错误会使您损失数小时的编码!

我发布的代码中有两个错误:

1-在xhttp.setRequestHeader(“ Content-Type”,“ application / json;”)行上;引号内的分号不应存在。因此正确的行是xhttp.setRequestHeader(“ Content-Type”,“ application / json”);

2-发送的数据格式不正确:

而不是'beginDate':{'$ gte':'2019-05-23T00:00:00.000Z'}它必须是beginDate:{gte:'2019-05-23T00:00:00.000Z'}

在引号中包含“ beginDate”和“ gte”可防止nodejs将它们作为标识符进行处理。 gte前面的$也是如此。有了这些引号,就不可能使用req.body.beginDate访问数据。

希望这些信息对其他人有帮助...