Работа над веб-приложением. У меня есть маршрут/представление, которое заполняет загрузочные карты на основе данных от вызова API к URL-адресу. Эти данные прекрасно заполняются с помощью цикла forEach, и я использую EJS для установки элементов карты, таких как абзац, в соответствующие данные из вызова API. Однако у меня есть один элемент на картах, который не включен в вызов API, но у меня есть данные в локальном mongodb (с использованием mongoose в этом приложении). Мой уровень навыков очень начальный, поэтому я не совсем уверен, как сделать следующую часть. Я тщательно искал ответ. я хочу получить
элемент на карточке, чтобы показать соответствующее поле из базы данных с использованием идентификатора (который является динамическим на основе вызова API), чтобы определить правильные данные для использования из документа. Это приложение покажет информацию о платных дорогах в каждом штате. Вызов API возвращает все платные дороги для штата на основе выбора пользователем штата. Карточки начальной загрузки заполняют некоторую базовую информацию из вызова API о платных дорогах. Но у меня есть описание платных в БД, которое не включено. Загрузочная карта будет динамически получать толлид, который также есть у db. Мне просто нужно выяснить, как получить locdesc из базы данных на основе соответствующего tollid на карте. Я надеюсь, что в этом есть смысл. Код ниже....
Я могу выполнить find() и получить данные из базы данных на моем маршруте, поэтому я чувствую, что почти у цели.
-------------------МАРШРУТ------------------------------ -----------------------
app.get("/results", isLoggedIn, function(req, res){
var state = req.query.state
Locationdesc.find({ state: state }, function(err, locdesc){
if (err){
console.info(err)
} else {
request("https://apiurlgoeshere" + state + "apiurlgoeshere", function(error, response, body){
if (!error && response.statusCode == 200){
var parsedData = JSON.parse(body)
res.render("results", {data:parsedData, locdesc:locdesc})
}
})
}
})
})
------------------КОНЕЦ МАРШРУТА---------------------------------------------------------
----------------ПОСМОТРЕТЬ------------------------------
<% include ./partials/header %>
<div class = "container">
<header class = "jumbotron mb-5">
<div class = "container text-center">
<h1>Select a Toll to View Additional Information and Do Something with Notifications and Alerts</h1>
<p>
<a class = "btn btn-primary btn-large" href = "/search">Back To Search</a>
</p>
</div>
</header>
<div class = "album py-">
<div class = "container">
<div class = "row">
<% data["features"].forEach(function(toll){ %>
<div class = "col-md-4 col-lg-3 col-sm-6 card-group">
<div class = "card shadow mb-4">
<div class = "card-body d-flex flex-column">
<p class = "card-text">Toll ID - <%= toll["attributes"]["tollid"] %></p>
<p class = "card-text">Cost- <%= toll["attributes"]["cost"] %></p>
<p class = "card-text">Location - <%= toll["attributes"]["location"] %></p>
<p class = "card-text">Location Description - ??????????????????????? </p>
<p class = "card-text hide">State - <%= gauge["attributes"]["state"] %></p>
</div>
</div>
</div>
<% }) %>
</div>
</div>
</div>
--------------------------------КОНЕЦ ПРОСМОТРА---------------- ------------------
--------------------------------СХЕМА БД---------------- -----
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var locSchema = new mongoose.Schema ({
locdesc: String,
tollid: String,
state: String
})
var Locationdesc = mongoose.model("Locationdesc", locSchema)
module.exports = mongoose.model('Locationdesc', locSchema);
описание местоположения хранится в mongodb. приведенная выше схема является схемой для коллекции описания местоположения (Locationdesc). Он включает в себя состояние, описание местоположения и идентификатор платы. Платный идентификатор — это то, что будет иметь карта, которая скажет мне, какое описание местоположения вернуть. В представлении будет несколько карт, поэтому мне нужно будет использовать tollid из каждой карты, чтобы вернуть locdesc для этой конкретной карты.
У вас есть доступ к locdesc
, что не так :
<div>
<% data["features"].forEach(function(toll){ %>
<p class = "card-text">Toll ID - <%= toll["attributes"]["tollid"] %></p>
<p class = "card-text">Cost- <%= toll["attributes"]["cost"] %></p>
<p class = "card-text">Location - <%= toll["attributes"]["location"] %></p>
<% if (locdesc.filter(location => location.tollid == toll["attributes"]["tollid"])[0]['locdesc']) { %>
<p class = "card-text">Location Description <%= locdesc.filter(location => location.tollid == toll.tollid)[0]['locdesc'] %>
<% } %>
<p class = "card-text hide">State <%= toll.state %></p>
<% }) %>
</div>
Использование filter
поможет.
Итак, я пробовал это раньше, но я не думал, что это сработает, потому что... В маршруте и в find() я возвращаю атрибуты для всех пунктов взимания платы в определенном состоянии. Таким образом, locdesc.locdesc недостаточно конкретен. Каждое место взимания платы имеет свою собственную карту, и карты заполняются для всех мест взимания платы в штате. У locdesc есть поле tollid, которое будет одинаковым в карте и в базе данных. Я надеюсь, что в этом есть смысл. Думаю, мне нужен (псевдокод): locdesc.locdesc, где tollid на карте равен tollid в db...
Вы можете использовать filter
, а затем выбрать первый элемент в возвращаемом массиве.
Мое незнание здесь смущает. Я не уверен, как это сделать, но изучу его и вернусь... скоро, я надеюсь!
Это определенно правильный путь. Сделал большой прогресс. Я не мог заставить его работать, используя нотацию со стрелкой, поэтому я возился с ней, используя нотацию function(). Итак, я получаю полный документ, возвращенный из БД. Всего 3 поля (state, tollid и locdesc). Код: <%= toll["attributes"]["tollid"] %>, который я использую для других элементов, относится к URL-адресу API JSON, а не к базе данных. Вот мой код на данный момент: <p class = "card-text">Описание местоположения - <%= locdesc.filter(function(locdesc) {return locdesc.tollid == toll["attributes"]["tolllid"]}) %> </p>....
Документ направляется на правильную карту, поэтому он соответствует информации о платных дорогах, полученной из URL-адреса API.
Не забудьте проверить, определен ли locdesc, как показано в ответе.
Итак, я думаю, проблема в том, что я, возможно, использую вложенные массивы... В каждом массиве есть {state, locdesc, tollid}. Я могу вернуть весь этот массив в соответствующей карте, но все, что мне нужно/хочу, это locdesc, когда tollid соответствует tollid из данных API. Возможно, мне придется опубликовать новый вопрос, но я собираюсь отметить этот вопрос как ответ, так как ваш ответ привел меня туда, где, по крайней мере, я могу что-то вернуть. Большое спасибо и дальше...
Где хранится описание вашего местоположения?