I want to make searchDate API (I am using Express, Mongoose and Angular). I need to return list of data between two dates.
Somehow it is working only if I hardcode date in $gte and $lt
My api code:
router.get("/searchDate", async (req, res) => {
try {
const { startDate, endDate } = req.query;
const containers = await Container.aggregate([
{
$match: {
$or: [
{
manufacturingDate: {
$gte: new Date(startDate),
$lt: new Date(endDate),
},
},
],
},
},
]);
res.status(200).json(containers);
} catch (err) {
res.status(404).json({ success: false, msg: "Container not found" });
}
});
And my model is:
import * as mongoose from "mongoose";
const ContainerType = require("./ContainerType");
const Schema = mongoose.Schema;
const ContainerSchema = new mongoose.Schema({
owner: { type: String, required: true },
manufacturingNo: { type: String, required: true },
IdentificationNo: { type: String, required: true },
manufacturingDate: { type: Date, required: true },
nextInspectionDate: { type: Date, required: true },
});
module.exports = mongoose.model("Containers", ContainerSchema);
That is how the date looks in my MongoDB Compass

An error I am getting from the api /searchDate is:

CodePudding user response:
This actually has nothing to do with Mongo, and is just a regular TypeScript error.
The startDate and endDate variables are not (as far as TS can tell) necessarily safe to construct a Date object from.
You can either cast, e.x. new Date(String(startDate)), or better, assert or throw somewhere above if typeof startDate !== 'string'.
This is assuming that startDate is indeed a string, which is highly likely but not necessarily true (as TypeScript is telling you).
Keep in mind it's also possible that constructing a Date from a string can result in an Invalid Date object.
