Mongoose 5.0.15 / MongoDB 3.6.4 Приведение к массиву Не удалось получить значение [NaN, NaN] - PullRequest
0 голосов
/ 11 мая 2018

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

Если кто-то со свежим взглядом знает, что происходит, это было бы феноменально. Спасибо

1 Ответ

0 голосов
/ 11 мая 2018

Эта проблема теперь решена. Как и предполагалось, это не имело ничего общего с предыдущими вопросами, заданными здесь и в GitHub. Проблема заключалась в том, что запрос, переданный через Postman, не подходит для mongoose schema. Это произошло из-за требований проверки , которые имелись в различных полях документов, и поэтому при составлении каждого запроса потребовалась всего одна крошечная ошибка.

Как только я начал тестировать элементы req.body один за другим, я получал постоянные ошибки, но сервер, однако, начинал правильно регистрировать некоторые поля, хотя и изолированно и по одному. Это было откровением, чтобы проверить все поля, пока я не нашел правильную комбинацию. Неожиданно req.body сначала вернул пустой объект, потому что запрос был прерван в первом случае.

Все предыдущие попытки, то есть изменение type на keyType с использованием body-parser вместо встроенного промежуточного программного обеспечения express для обработки запросов JSON и URL-адресов и т. Д., Были хорошими попытками, но безуспешными.

Спасибо всем за помощь и изучение этого вопроса со мной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...