Мой внешний интерфейс 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
()