ich ein paar Stunden mit reichlich console.logs verbracht habe versucht, herauszufinden, warum dies nicht funktioniert und Grund bin etwas fehlt hier:Mongoose Subdokument - ID nicht gefunden
Das Szenario ist von Simon Holmes' Buch auf MEAN bekommen (Kapitel 6). Entschuldigungen für das Kopieren der gesamten Funktion, aber ich wollte sicherstellen, dass ich nicht etwas Offensichtliches vermisste.
Ich habe ein Schema wie folgt definiert:
var mongoose = require('mongoose');
var reviewSchema = new mongoose.Schema({
author: String,
rating: { type: Number, required: true, min: 0, max: 5 },
reviewText: String,
createdOn: { type: Date, "default": Date.now }
});
var openingTimeSchema = new mongoose.Schema({
days: { type: String, required: true },
opening: String,
closing: String,
closed: { type: Boolean, required: true }
});
var locationSchema = new mongoose.Schema({
name: { type: String, required: true },
address: String,
rating: { type: Number, "default": 0, min: 0, max: 5 },
facilities: [String],
// Always store coordinates longitude, latitude order.
coords: { type: [Number], index: '2dsphere' },
openingTimes: [openingTimeSchema],
reviews: [reviewSchema]
});
mongoose.model('Location', locationSchema);
und einige Code, um einen einzigen Standort mit einer bestimmten Bewertung zu lesen:
module.exports.reviewsReadOne = function(req, res) {
console.log('locationid = ' + req.params.locationid);
console.log('reviewid = ' + req.params.reviewid);
if (req.params && req.params.locationid && req.params.reviewid) {
Loc
.findById(req.params.locationid)
.select('name reviews')
.exec (
function(err, location) {
var response, review;
if (!location) {
sendJsonResponse(res, 404, {
"message" : "locationid not found"
});
return;
} else if (err) {
sendJsonResponse(res, 400, err);
return;
}
console.log('reviews = ' + location.reviews);
// Note the rating here...
console.log('#0.rating = ', location.reviews[0].rating);
// Note the id here...
console.log('#0.id = ', location.reviews[0].id);
if (location.reviews && location.reviews.length > 0) {
review = location.reviews.id(req.params.reviewid);
console.log('returned review = ' + review);
if (!review) {
sendJsonResponse(res, 404, {
"message" : "reviewid not found"
});
} else {
response = {
location: {
name : location.name,
id : req.params.locationid
},
review : review
};
sendJsonResponse(res, 200, response);
}
} else {
sendJsonResponse(res, 404, {
"message" : "No reviews found"
});
}
}
);
} else {
sendJsonResponse(res, 404, {
"message" : "Not found, locationid and reviewid are both required"});
}
};
Mit Google Postman, mache ich eine Anfrage an die API :
localhost:3000/api/locations/5706bbc7b47a0b25981d3a40/reviews/5706bd65b47a0b25981d3a41
Aber ich bekomme eine Antwort von
Was mich hier verwirren ist, dass ich glaube, dass ich die korrekte Überprüfung Filialdokument ID referenzieren, aber die JSON, die dies zeigt, Jesse, Javascript sieht es nicht, und könnte erklären, warum die Mungo-Funktion wird es nicht zurückgeben :
das ist meine Spur:
locationid = 5706bbc7b47a0b25981d3a40
reviewid = 5706bd65b47a0b25981d3a41
reviews = { author: 'Simon Holmes',
id: 5706bd65b47a0b25981d3a41,
rating: 5,
timestamp: Tue Jul 16 2013 00:00:00 GMT+0100 (BST),
reviewText: 'What a great place. I can\'t say enough good things about it.',
createdOn: Fri Apr 08 2016 19:50:15 GMT+0100 (BST) },{ author: 'Jon M',
id: 5706bda2b47a0b25981d3a42,
rating: 5,
timestamp: Tue Sep 09 2014 00:00:00 GMT+0100 (BST),
reviewText: 'Meh...',
createdOn: Fri Apr 08 2016 19:50:15 GMT+0100 (BST) }
#0.rating = 5
#0.id = null
returned review = null
GET /api/locations/5706bbc7b47a0b25981d3a40/reviews/5706bd65b47a0b25981d3a41 404 34.468 ms - 32
Wie Sie das Standortdokument gefunden sehen können, werden die Bewertungen Subdokumente gefunden, und es ist sogar möglich, den Bewertungswert des ersten Elements auszudrucken. Die ID ist jedoch null, obwohl sie in den JSON-Nutzdaten als Wert angezeigt wird.
Gibt es etwas, das ich hier falsch mache?
Wie immer, jede Hilfe geschätzt.
Jon