Как вытащить строки из MongoDB и поместить в переменную? [как отобразить данные из mondo в http ответе в nodejs]


#1

Доброго времени суток!
Новичок, и сразу встала задача - как вытащить строки из БД MongoDB и поместить их в переменную? Нужно прочитать все что есть в определенной коллекции и поместить это в переменную. Далее из этой переменной нужно результат отобразить на html страничке.
Может кто знает, что нужно для это сделать…

Вот сама структура кода (стратует сервер на 3000 порту, далее лезем в базу методом find() ) :

var http = require("http");
var fs = require("fs");
http.createServer(function(request, response){
    console.log(`Запрошенный адрес: ${request.url}`);
    if(request.url.startsWith("/2gis/index.html")){

        var filePath = request.url.substr(1);
        fs.readFile(filePath, function(error, data){

            if(error){

                response.statusCode = 404;
                response.end("Resurs ne naiden");
            }
            else{
                response.end(data);
            }
            return;
        })
    }
    else{
        // во всех остальных случаях отправляем строку hello world!
        response.end("Hello World!");
    }
}).listen(3000);

////////////////////////////////////////////////////////////////
const mongoClient = require("mongodb").MongoClient;
  const url = "mongodb://localhost:27017/";
mongoClient.connect(url, function(err, client){
    const db = client.db("usersdb");
    const collection = db.collection("users");
    if(err) return console.log(err);
    collection.find().toArray(function(err, results){
        console.log(results);
        client.close();
    });
});

Результаты Консоли:

(node:6516) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser:
 true } to MongoClient.connect.
[ { _id: 5bcda20cf07d33392866ce14,
    name: 'тестовый текст улица Мухтара Ауэзова, 10',
    age: '15.10.2018',
    kord: '51.166158, 71.425328' },
  { _id: 5bcda2f1f07d33392866ce15,
    name: 'Тестовый текст 2 улица Сакена Сейфуллина, 34',
    age: '16.10.2018',
    kord: '51.170354, 71.422432' },
  { _id: 5bcda3bfc46c613260d39901,
    name: 'Текстовый тест ',
    age: '17.10.2018',
    kord: '51.173739, 71.446909' },
  { _id: 5bcda3f56de4c2349c92f882,
    name: 'Текстовый тест 2',
    age: '18.10.2018',
    kord: '51.188744, 71.455957' } ]

Все работает без ошибочно.


#2

Новичок, и сразу встала задача - как вытащить строки из БД MongoDB и поместить их в переменную? Нужно прочитать все что есть в определенной коллекции и поместить это в переменную. Далее из этой переменной нужно результат отобразить на html страничке.

Тут ход мышления должен быть другой. Когда работаешь с асинхронными операциями (т.е. почти всегда) в javascript, нужно думать о данных как о последовательности асинхронных вызовов, асинхронных преобразований данных. Примерно так же как твой код описывает работу с mongo. Т.е. передавать данные из одного коллбека в другой.

Стратегия при работе с вебсервером такая: есть объект ответа, когда вызывается метод .send, nodeJS отправляет клиенту то, что передали в .send. Ты вызываешь цепочку асинхронных операций, передавая преобразованные в коллбек, внутри последнего вызываешь .send на объекте ответа. Результат уходит клиенту.

На практике используют функции/фреймверки оберткий чтобы эти операции было проделывать проще. Например абстрагировать создание соединения и его закрытие. А еще свякие async/await чтобы код выглядел более последовательно, и менее вложенно (как в том примере что я кидаю).

Ниже пример того что я имею в виду. Это очень грязный и нерасширяемый подход. Главная его цель - проиллюстрировать как работает асинхронная передача данных.

var http = require("http");
var fs = require("fs");
const mongoClient = require("mongodb").MongoClient;
const url = "mongodb://localhost:27017/";
http.createServer(function(request, response) {
    console.log(`Запрошенный адрес: ${request.url}`);
    if (request.url.startsWith("/2gis/index.html")) {

        var filePath = request.url.substr(1);
        fs.readFile(filePath, function(error, data) {

            if (error) {

                response.statusCode = 404;
                response.end("Resurs ne naiden");
            } else {
                response.end(data);
            }
            return;
        })
    } else {
        mongoClient.connect(url, function(err, client) {
            const db = client.db("usersdb");
            const collection = db.collection("users");
            if (err) return console.log(err);
            collection.find().toArray(function(err, results) {
                response.setHeader('Content-Type', 'text/html')
                response.end(`<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <pre><code>${JSON.stringify(results, null, '  ')}</code></pre>
</body>
</html>`);
                client.close();
            });
        });
    }
}).listen(3000);

#3

Спасибо!
Может ткнете носом, что нужно читать, в каком направлении мне гуглить чтобы начать понимать как это делается?


#4

Вот этот репозиторий https://github.com/marekdano/express-mongodb-blog неплох для начала. Обрати внимание на подход к разделению кода. И не забывай что единственно правильного подхода нет, что бы не говорили всякие гуру.

Годных готовых туториалов не встречал, сам учился через trial/error, читал посты, реже чужой код, смотрел как такие же задачи решаются в других фреймворках.


#5

Вот годный готовый, но устаревший: