I’ve been trying to complete the “Use model.findOne() to Return a Single Matching Document from Your Database” challenge under the MongoDB and Mongoose lessons on freeCodeCamp, but despite having the same code as the solution, the test fails.
I’ve double checked the formatting of my MongoDB URI in the .env, I’ve tried troubleshooting it as a CORS error, and I’ve even tried disabling my firewall and turning off adblockers / script blockers for freeCodeCamp, mongoDB, and Replit, but to no avail.
When I click the submission button to complete the challenge, the console immediately displays the POST request, but it doesn’t show up under the Network tab in DevTools, and after a varying number of seconds, [object Object] is printed to the console.
What can I do to resolve, or even debug this?
Thanks in advance for your time and consideration.
Edit: The function that specifically should be executing is findOneByFood.
myApp.js –
const mongoose = require('mongoose');
const { Schema } = mongoose;
mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true });
const personSchema = new Schema({
name : { type: String, required: true },
age : Number,
favoriteFoods : [{ type: String, unique: true }]
});
let Person = mongoose.model('Person', personSchema);
const createAndSavePerson = (done) => {
const johnCarmack = new Person({ name: "John Carmack", age: 51, favoriteFoods: ['iunno', 'Probably Pizza', 'I'm Not Googling It'] });
johnCarmack.save((err, data) => {
if (err) return done(err);
done(null, data);
});
};
const createManyPeople = (arrayOfPeople, done) => {
Person.create(arrayOfPeople, (err, data) => {
if (err) return done(err);
done(null, data);
})
};
const findPeopleByName = (personName, done) => {
Person.find({ name: personName }, (err, data) => {
if (err) return done(err);
done(null, data);
});
};
const findOneByFood = (food, done) => {
Person.findOne({ favoriteFoods: food }, (err, data) => {
if (err) return console.log(err);
done(null, data);
});
};
const findPersonById = (personId, done) => {
done(null /*, data*/);
};
const findEditThenSave = (personId, done) => {
const foodToAdd = "hamburger";
done(null /*, data*/);
};
const findAndUpdate = (personName, done) => {
const ageToSet = 20;
done(null /*, data*/);
};
const removeById = (personId, done) => {
done(null /*, data*/);
};
const removeManyPeople = (done) => {
const nameToRemove = "Mary";
done(null /*, data*/);
};
const queryChain = (done) => {
const foodToSearch = "burrito";
done(null /*, data*/);
};
/** **Well Done !!**
/* You completed these challenges, let's go celebrate !
*/
//----- **DO NOT EDIT BELOW THIS LINE** ----------------------------------
exports.PersonModel = Person;
exports.createAndSavePerson = createAndSavePerson;
exports.findPeopleByName = findPeopleByName;
exports.findOneByFood = findOneByFood;
exports.findPersonById = findPersonById;
exports.findEditThenSave = findEditThenSave;
exports.findAndUpdate = findAndUpdate;
exports.createManyPeople = createManyPeople;
exports.removeById = removeById;
exports.removeManyPeople = removeManyPeople;
exports.queryChain = queryChain;
server.js –
* DO NOT EDIT THIS FILE
* the verification process may break
*******************************************/
const express = require("express");
const app = express();
let mongoose;
try {
mongoose = require("mongoose");
} catch (e) {
console.log(e);
}
const fs = require("fs");
const path = require("path");
const bodyParser = require("body-parser");
const router = express.Router();
const enableCORS = function (req, res, next) {
if (!process.env.DISABLE_XORIGIN) {
const allowedOrigins = ["https://www.freecodecamp.org"];
const origin = req.headers.origin;
if (!process.env.XORIGIN_RESTRICT || allowedOrigins.indexOf(origin) > -1) {
console.log(req.headers.origin + ", " + req.method);
res.set({
"Access-Control-Allow-Origin": origin,
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Headers":
"Origin, X-Requested-With, Content-Type, Accept",
});
}
}
next();
};
// global setting for safety timeouts to handle possible
// wrong callbacks that will never be called
const TIMEOUT = 10000;
app.use(bodyParser.urlencoded({ extended: "false" }));
app.use(bodyParser.json());
app.get("/", function (req, res) {
res.sendFile(path.join(__dirname, "views", "index.html"));
});
router.get("/file/*?", function (req, res, next) {
if (req.params[0] === ".env") {
return next({ status: 401, message: "ACCESS DENIED" });
}
fs.readFile(path.join(__dirname, req.params[0]), function (err, data) {
if (err) {
return next(err);
}
res.type("txt").send(data.toString());
});
});
router.get("/is-mongoose-ok", function (req, res) {
if (mongoose) {
res.json({ isMongooseOk: !!mongoose.connection.readyState });
} else {
res.json({ isMongooseOk: false });
}
});
const Person = require("./myApp.js").PersonModel;
router.use(function (req, res, next) {
if (req.method !== "OPTIONS" && Person.modelName !== "Person") {
return next({ message: "Person Model is not correct" });
}
next();
});
router.post("/mongoose-model", function (req, res, next) {
// try to create a new instance based on their model
// verify it's correctly defined in some way
let p;
p = new Person(req.body);
res.json(p);
});
const createPerson = require("./myApp.js").createAndSavePerson;
router.get("/create-and-save-person", function (req, res, next) {
// in case of incorrect function use wait timeout then respond
let t = setTimeout(() => {
next({ message: "timeout" });
}, TIMEOUT);
createPerson(function (err, data) {
clearTimeout(t);
if (err) {
return next(err);
}
if (!data) {
console.log("Missing `done()` argument");
return next({ message: "Missing callback argument" });
}
Person.findById(data._id, function (err, pers) {
if (err) {
return next(err);
}
res.json(pers);
pers.remove();
});
});
});
const createPeople = require("./myApp.js").createManyPeople;
router.post("/create-many-people", function (req, res, next) {
Person.remove({}, function (err) {
if (err) {
return next(err);
}
// in case of incorrect function use wait timeout then respond
let t = setTimeout(() => {
next({ message: "timeout" });
}, TIMEOUT);
createPeople(req.body, function (err, data) {
clearTimeout(t);
if (err) {
return next(err);
}
if (!data) {
console.log("Missing `done()` argument");
return next({ message: "Missing callback argument" });
}
Person.find({}, function (err, pers) {
if (err) {
return next(err);
}
res.json(pers);
Person.remove().exec();
});
});
});
});
const findByName = require("./myApp.js").findPeopleByName;
router.post("/find-all-by-name", function (req, res, next) {
let t = setTimeout(() => {
next({ message: "timeout" });
}, TIMEOUT);
Person.create(req.body, function (err, pers) {
if (err) {
return next(err);
}
findByName(pers.name, function (err, data) {
clearTimeout(t);
if (err) {
return next(err);
}
if (!data) {
console.log("Missing `done()` argument");
return next({ message: "Missing callback argument" });
}
res.json(data);
Person.remove().exec();
});
});
});
const findByFood = require("./myApp.js").findOneByFood;
router.post("/find-one-by-food", function (req, res, next) {
let t = setTimeout(() => {
next({ message: "timeout" });
}, TIMEOUT);
let p = new Person(req.body);
p.save(function (err, pers) {
if (err) {
return next(err);
}
findByFood(pers.favoriteFoods[0], function (err, data) {
clearTimeout(t);
if (err) {
return next(err);
}
if (!data) {
console.log("Missing `done()` argument");
return next({ message: "Missing callback argument" });
}
console.log(data);
res.json(data);
p.remove();
});
});
});
const findById = require("./myApp.js").findPersonById;
router.get("/find-by-id", function (req, res, next) {
let t = setTimeout(() => {
next({ message: "timeout" });
}, TIMEOUT);
let p = new Person({ name: "test", age: 0, favoriteFoods: ["none"] });
p.save(function (err, pers) {
if (err) {
return next(err);
}
findById(pers._id, function (err, data) {
clearTimeout(t);
if (err) {
return next(err);
}
if (!data) {
console.log("Missing `done()` argument");
return next({ message: "Missing callback argument" });
}
res.json(data);
p.remove();
});
});
});
const findEdit = require("./myApp.js").findEditThenSave;
router.post("/find-edit-save", function (req, res, next) {
let t = setTimeout(() => {
next({ message: "timeout" });
}, TIMEOUT);
let p = new Person(req.body);
p.save(function (err, pers) {
if (err) {
return next(err);
}
try {
findEdit(pers._id, function (err, data) {
clearTimeout(t);
if (err) {
return next(err);
}
if (!data) {
console.log("Missing `done()` argument");
return next({ message: "Missing callback argument" });
}
res.json(data);
p.remove();
});
} catch (e) {
console.log(e);
return next(e);
}
});
});
const update = require("./myApp.js").findAndUpdate;
router.post("/find-one-update", function (req, res, next) {
let t = setTimeout(() => {
next({ message: "timeout" });
}, TIMEOUT);
let p = new Person(req.body);
p.save(function (err, pers) {
if (err) {
return next(err);
}
try {
update(pers.name, function (err, data) {
clearTimeout(t);
if (err) {
return next(err);
}
if (!data) {
console.log("Missing `done()` argument");
return next({ message: "Missing callback argument" });
}
res.json(data);
p.remove();
});
} catch (e) {
console.log(e);
return next(e);
}
});
});
const removeOne = require("./myApp.js").removeById;
router.post("/remove-one-person", function (req, res, next) {
Person.remove({}, function (err) {
if (err) {
return next(err);
}
let t = setTimeout(() => {
next({ message: "timeout" });
}, TIMEOUT);
let p = new Person(req.body);
p.save(function (err, pers) {
if (err) {
return next(err);
}
try {
removeOne(pers._id, function (err, data) {
clearTimeout(t);
if (err) {
return next(err);
}
if (!data) {
console.log("Missing `done()` argument");
return next({ message: "Missing callback argument" });
}
console.log(data);
Person.count(function (err, cnt) {
if (err) {
return next(err);
}
data = data.toObject();
data.count = cnt;
console.log(data);
res.json(data);
});
});
} catch (e) {
console.log(e);
return next(e);
}
});
});
});
const removeMany = require("./myApp.js").removeManyPeople;
router.post("/remove-many-people", function (req, res, next) {
Person.remove({}, function (err) {
if (err) {
return next(err);
}
let t = setTimeout(() => {
next({ message: "timeout" });
}, TIMEOUT);
Person.create(req.body, function (err, pers) {
if (err) {
return next(err);
}
try {
removeMany(function (err, data) {
clearTimeout(t);
if (err) {
return next(err);
}
if (!data) {
console.log("Missing `done()` argument");
return next({ message: "Missing callback argument" });
}
Person.count(function (err, cnt) {
if (err) {
return next(err);
}
if (data.ok === undefined) {
// for mongoose v4
try {
data = JSON.parse(data);
} catch (e) {
console.log(e);
return next(e);
}
}
res.json({
n: data.n,
count: cnt,
ok: data.ok,
});
});
});
} catch (e) {
console.log(e);
return next(e);
}
});
});
});
const chain = require("./myApp.js").queryChain;
router.post("/query-tools", function (req, res, next) {
let t = setTimeout(() => {
next({ message: "timeout" });
}, TIMEOUT);
Person.remove({}, function (err) {
if (err) {
return next(err);
}
Person.create(req.body, function (err, pers) {
if (err) {
return next(err);
}
try {
chain(function (err, data) {
clearTimeout(t);
if (err) {
return next(err);
}
if (!data) {
console.log("Missing `done()` argument");
return next({ message: "Missing callback argument" });
}
res.json(data);
});
} catch (e) {
console.log(e);
return next(e);
}
});
});
});
app.use("/_api", enableCORS, router);
// Error handler
app.use(function (err, req, res, next) {
if (err) {
res
.status(err.status || 500)
.type("txt")
.send(err.message || "SERVER ERROR");
}
});
// Unmatched routes handler
app.use(function (req, res) {
if (req.method.toLowerCase() === "options") {
res.end();
} else {
res.status(404).type("txt").send("Not Found");
}
});
const listener = app.listen(process.env.PORT || 3000, function () {
console.log("Your app is listening on port " + listener.address().port);
});
/********************************************
* DO NOT EDIT THIS FILE
* the verification process may break
*******************************************/