0

Ситуация

У меня есть node.js сервер на express. С помощью socket.io хочу отправить данные из базы данных mongodb на клиент.

const socket = require('socket.io');
const io = socket(server);

//Запускаю сервер и подключаюсь к базе данных //переменная "db" - база данных

io.on('connection', socket => { console.info(Connected: ${socket.id}); socket.on('disconnect', () => { console.info(Disconected: ${socket.id}) }); socket.on('search', data => { // верхний уровень var results = []; db.collection('diseases').find({'ttl.txt': {$regex: data, $options: 'i'}}).forEach(document =>{ // нижний уровень results.push(document.ttl[0].txt); }); io.sockets.emit('search', results); }); });

Проблема

На нижнем уровне хочу записать в переменную results, расположенную на верхнем уровне данные. Хотя на нижнем уровне переменная перезаписывается, на верхнем остается без изменений.

Вопрос

Подскажите пожалуйста как решить эту проблему. Эта проблема возникает у меня довольно часто, но всегда находил запасной план, но тут не смог. Заранее благодарю.

  • возможно я поторопился с дубликатом: метод find - синхронная функция или асинхронная? Если синхронная - то скорее всего она просто возвращает пустой массив, и в forEach даже не заходит, вот почему возвращается пустой results – Grundy Jul 19 '17 at 15:23
  • Метод find асинхронная функция. Запрос возвращает нужные документы, и если вывести переменную results на нижнем уровне в консоль - она покажет то что нужно, но вот на верхнем не переписывается. – Max Mikhalchuk Jul 19 '17 at 15:30
  • тогда дубликат правильный. – Grundy Jul 19 '17 at 15:31
  • Если я не ошибаюсь Вам поможет что-то вроде этого подхода: db.collection('diseases').find({'ttl.txt': {$regex: data, $options: 'i'}}, (err, documents) => { io.sockets.emit('search', documents.map((document) => document.ttl[0].txt)); }) – Alexander Kiselev Jul 19 '17 at 15:35

0 Answers0