У меня есть API, который получает ajax-вызов от клиента и управляет ответом для отображения полученных данных.
Ответ - это массив объектов, заполненных всеми документами в коллекции mongodb, но когдаон прибыл пуст.
Сценарий на сервере работает, и я могу записать массив перед отправкой, я искал много тем, но ничего не подходит.
Сервер:
app.route('/api/issues/:project')
.get(function (req, res) {
var project = req.params.project;
var result = [];
mongo.connect(process.env.DATABASE, (err, db) => {
if (err) {
console.log('Database error: ' + err);
} else {
console.log('getting...');
db.collection('apitest').find().forEach(element => {
result.push(element);
});
console.log(result);
res.send(result);
};
}
);
})
Клиент:
$(function() {
var currentProject = window.location.pathname.replace(/\//g, "");;
var url = "/api/issues/"+currentProject;
$('#projectTitle').text('All issues for: '+currentProject);
$.ajax({
type: "GET",
url: url,
success: function(data)
{
console.log(this);
var issues= [];
data.forEach(function(ele) {
console.log(ele);
var openstatus;
(ele.open) ? openstatus = 'open' : openstatus = 'closed';
var single = [
// example
'<div>' + ele.property + '</div>',
'<div>' + ele.property + '</div>',
'<div>' + ele.property + '</div>'
];
issues.push(single.join(''));
});
$('#issueDisplay').html(issues.join(''));
}
});
});
Обновление:
Я нашел проблему и «решение».Проблема в том, что вызов асинхронный, поэтому перед подключением к БД и заполнению массива ответ начинается, когда значением результата является пустой массив.
Я решил включить ответ в setTimeout, но я не уверен, что это правильный способ справиться с этим делом.Если кто-нибудь может предложить мне некоторые начальные чтения об асинхронных, я действительно ценю это.
setTimeout(function () {
res.send(result);
}, 50);