MongoDB GeoJSON $ рядом с ошибкой AssertionError - PullRequest
0 голосов
/ 24 апреля 2019

Мой внешний интерфейс Angular возвращает AssertionError после выполнения запроса к моему внутреннему узлу Node / Mongo при попытке отобразить маркеры карты на карте MapBox GL JS:

actual: false
code: "ERR_ASSERTION"
expected: true
generatedMessage: true
name: "AssertionError [ERR_ASSERTION]"
operator: "=="

Это для Angular 7приложение, использующее бэкэнд Node / MongoDB.У меня есть коллекция «Пользователи» с точками GeoJSON.Я попытался использовать метод db.collection.find() с $near и $geoNear, оба из которых выдают ошибку.Если я удаляю эти выражения и выполняю простое db.collection.find({}), ответ возвращается, как и ожидалось.

Кроме того, я могу сделать запрос, используя клиент REST (Restlet for Chrome) с $geoNear express ирезультаты возвращаются правильно.

Я также выглядел как можно лучше в Google и Stackoverflow, чтобы получить ответ безрезультатно.

users.js route:

router.get('/trucks', (req, res, next) => {
    User
    .find({
        'geometry': {
            $nearSphere: {
                $geometry: {
                    type : "Point",
                    coordinates: [
                        parseFloat(req.query.lng),
                        parseFloat(req.query.lat),
                    ]
                },
                $maxDistance : 100000
            }
        }
    })
    .then((users, err) => {
        if (err) res.json({success: false, message: 'There was a problem with the lookup.'});
        if (!users) res.json({success: true, message: "Sorry, we couldn't find anyone in your area."})
        let results = users.map(user=> {
            let userResult = {
                id: user._id,
                name: user.name,
                username: user.username,
                email: user.email,
                geometry: {
                    type: user.geometry.type,
                    coordindates: user.geometry.coordinates
                }
            }
            return userResult;
        });

        res.json({
            success: true,
            users: results
        });
    })
    .catch(err =>
        res.json(err)
    );
})

map.service.getMarkers ():

  getMarkers(): Observable<GeoJson> {
    return this.http.get<any>('http://localhost:3000/users');
  }

Класс GeoJson:

export class GeoJson implements IGeoJson {
  type = 'Feature';
  geometry: IGeometry;

  constructor(coordinates, public properties?) {
    this.geometry = {
      type: 'Point',
      coordinates: coordinates
    }
  }
}

map.component:

ngOnInit() {
    this.markers = this.mapService.getMarkers();
    this.initMap();
  }

...

private initMap() {
    // ommited code to get location using navigator geolocation API

    this.setMap()
  }

...

setMap() {
    // ommited code to style map

      this.markers.subscribe((result) => {
        let markers = [];

        result.trucks.forEach(truck => {
           console.log(user.geometry.coordindates);
           let coordinates = user.geometry.coordindates;
           let newMarker = new GeoJson(coordinates, { message: user.name });
           markers.push(newMarker)
        })

        let data = new FeatureCollection(markers)
        this.source.setData(data)
      })

    })
}

Я ожидаю получить ответсодержащий моих пользователей, чтобы я мог отобразить их местоположение.Как я уже говорил выше, я могу сделать запрос, используя REST-клиент, и все работает как ожидалось.Кроме того, универсальный db.collection.find({}) вернет все мои документы, и тогда я могу сопоставить.Кажется, проблема в:

'geometry': {
            $nearSphere: {
                $geometry: {
                    type : "Point",
                    coordinates: [
                        parseFloat(req.query.lng),
                        parseFloat(req.query.lat),
                    ]
                },
                $maxDistance : 100000
            }
        }

Образец документа из MongoDB

Успешный ответ с использованием клиента REST

Рабочий результат с удаленным из find выражением $geoNear ()

1 Ответ

0 голосов
/ 25 апреля 2019

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

return this.http.get<any>('http://localhost:3000/users');

должно быть:

return this.http.get<any>('http://localhost:3000/users?lng=&lat=');

Это решило мою проблему.

...