Пустой массив ответа на запрос Get - PullRequest
0 голосов
/ 22 апреля 2020

Я следую полному стеку руководства по веб-разработке. Репозиторий git можно найти здесь: https://github.com/cliveharber/gettingMean-2/tree/chapter-06

В главе 6 я создал API, который должен отображать список местоположений на основе координат GPS. Когда я проверяю запрос get, я получаю пустой массив. URL запроса получения: http://localhost: 3000 / api / location? Lat = 51.455041 & lng = -0.9690884

Это код контроллера для местоположений: обратите внимание, что я использую Mon goose агрегат с именем $ geonear, чтобы найти список местоположений, близких к указанной точке

  

const locationsListByDistance = async (req, res) => {
  const lng = parseFloat(req.query.lng);
  const lat = parseFloat(req.query.lat);
  const near = {
    type: "Point",
    coordinates: [lng, lat]
  };
  const geoOptions = {
    distanceField: "distance.calculated",
    key: 'coords',
    spherical: true,
    maxDistance: 20000
  };
  if (!lng || !lat) {
    return res
      .status(404)
      .json({ "message": "lng and lat query parameters are required" });
  }

  try {
    const results = await Loc.aggregate([
      {
        $geoNear: {
          near,
          ...geoOptions
        }
      }
    ]);
    const locations = results.map(result => {
      return {
        id: result._id,
        name: result.name,
        address: result.address,
        rating: result.rating,
        facilities: result.facilities,
        distance: `${result.distance.calculated.toFixed()}m`
      }
    });
    res
      .status(200)
      .json(locations);
  } catch (err) {
    res
      .status(404)
      .json(err);
  }
};

   

Это моя модель местоположения:

   

 const locationSchema = new mongoose.Schema({
      name: {
        type: String,
        required: true
      },
      address: String,
      rating: {
        type: Number,
        'default': 0,
        min: 0,
        max: 5
      },
      facilities: [String],
      coords: {
        type: {type: String},
        coordinates: [Number]
      },
      openingTimes: [openingTimesSchema],
      reviews: [reviewSchema]
    });

Я уверен, что использую правильные координаты GPS в URL-адресе запроса на получение. Этот документ, который я пытаюсь получить из базы данных:

enter image description here

Я не уверен, почему я получаю пустой массив при тестировании этого API. Есть ли проблемы в моем коде?

1 Ответ

1 голос
/ 22 апреля 2020

Если я правильно читаю ваш код, то отправляемая вами агрегация выглядит следующим образом:

Loc.aggregate([
      {
        $geoNear: {
          {
           type: "Point",
           coordinates: [lng, lat]
          },
          distanceField: "distance.calculated",
          key: 'coords',
          spherical: true,
          maxDistance: 20000 
        }
      }
    ]);

Вы не упомянули создание индекса 2dsphere в поле coords коллекции, я Я предполагаю, что вы это сделали.

Похоже, что при агрегировании отсутствует имя поля near, например:

Loc.aggregate([
      {
        $geoNear: {
          near: {
                 type: "Point",
                 coordinates: [lng, lat]
          },
          distanceField: "distance.calculated",
          key: 'coords',
          spherical: true,
          maxDistance: 20000 
        }
      }
    ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...