Context
Это не копия этого
Как подробно объяснено ниже, я просмотрел сеть и прочитал около 20 похожих ошибок или статей, и пока ничего не решило эту проблему.
Я занимаюсь разработкой приложения для определения местоположения в двух разных ОС: Windows 8.1 и Linux / Ubuntu (16.4).
Следующие двигатели работают на машине Ubuntu; однако ошибка, которую я получаю, точно такая же, независимо от версии зависимости или ОС.
Node.js ~4.2.6
NPM ~ 3.5.2
MongoDB ~ 3.6.4
Mongoose ~5.0.15
Каково текущее поведение?
Я получаю эту ошибку, несмотря на то, что провел дни, исследуя подобные ошибки и тестируя / пробуя разные вещи.
От почтальона:
{
"errors": {
"coords": {
"message": "Cast to Array failed for value \"[ NaN, NaN ]\" at path \"coords\"",
"name": "CastError",
"stringValue": "\"[ NaN, NaN ]\"",
"kind": "Array",
"value": [
null,
null
],
"path": "coords",
"reason": {
"message": "Cast to [number] failed for value \"[null]\" at path \"coords\"",
....
"_message": "Location validation failed",
"message": "Location validation failed: coords: Cast to Array failed for value \"[ NaN, NaN ]\" at
path \"coords\", name: Path `name` is required., openingTimes.0.days: Path `days` is required.,
openingTimes.0.closed: Path `closed` is required.",
"name": "ValidationError"
}
Мое предположение здесь состоит в том, что это не просто проблема из-за ошибки приведения, но что-то не так со схемой для этого конкретного метода POST. Обратите внимание, что та же схема используется для методов GET и работает как charm.
Шаги для воспроизведения.
На данном этапе разработки я разрабатываю API и использую схему Mongoose для моделирования данных.
Это модель для API:
const` mongoose = require("mongoose");
const reviewSchema = new mongoose.Schema({
author: String,
rating: {$type: Number, required: true, min: 0, max: 5},
timestamp: {$type: Date, "default": Date.now},
reviewText: String
}, {typeKey: "$type"});
const openingTimeSchema = new mongoose.Schema({
days: {$type: String, required: true},
opening: String,
closing: String,
closed: {$type: Boolean, required: true}
}, {typeKey: "$type"});
const locationSchema = new mongoose.Schema({
name: {$type: String, required: true},
rating: {$type: Number, "default": 0, min: 0, max: 5},
address: String,
facilities: [String],
coords: {$type: [[Number]], index: '2dsphere', required:true},
openingTimes: [openingTimeSchema],
reviews: [reviewSchema]
}, {typeKey: "$type"});
mongoose.model("Location", locationSchema);
Примечание. Я использую typeKey
, как предлагается в разных статьях, а также в документации Mongoose для объектов geoJSON. Даже без использования typeKey
ошибка сохраняется.
Контроллер
const mongoose = require("mongoose");
const Loc = mongoose.model("Location");
const theEarth = (function(){
const earthRadious = 6371;
const getRadsFromDistance = (distance) => {
return parseFloat(distance / earthRadious);
};
return {
getRadsFromDistance: getRadsFromDistance
};
})();
var sendJsonResponse = (res, status, content) =>{
res.status(status);
res.json(content);
};
module.exports.locationsCreate = (req, res) => {
Loc.create({
name: req.body.name,
address: req.body.address,
facilities: req.body.facilities,
coords: [parseFloat(req.body.lng), parseFloat(req.body.lat)],
openingTimes: [{
days: req.body.days1,
opening: req.body.opening1,
closing: req.body.closing1,
closed: req.body.closed1
}]
}, function (err, location){
if (err){
sendJsonResponse(res, 400, err);
}
else{
sendJsonResponse(res, 201, location);
}
});
};
Ожидаемое поведение - POST для фиктивного местоположения, созданного в Postman:
POST / api / location HTTP / 1.1
Хост: localhost: 3000
название: Coffee BlaBlaBla
адрес: 435 High Street Paradise, Midnowhere
удобства: горячий кофе, завтрак, Wi-Fi
lng: 2.3567
широта: 41,5676
дней1: понедельник - пятница
открытие1: 8:00 утра1070*
закрытие 1: 5:00 вечера
закрыто1: ложь
Cache-Control: без кеша
Тип содержимого: application / x-www-form-urlencoded
Если кто-то со свежим взглядом знает, что происходит, это было бы феноменально.
Спасибо