Получите результаты с драйвером Mongodb Nodejs и Express с помощью find - PullRequest
0 голосов
/ 19 июня 2020

У меня есть крошечный express сервер, который я хочу использовать для получения некоторых данных из коллекции в моей базе данных:

const express = require('express');
const MongoClient = require('mongodb').MongoClient;
const app = express();
const PORT = 3000;
const MONGO_URI = 'mongodb://127.0.0.1:27017/test';


async function myReport(schoolId) {
  const client = new MongoClient(MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true });

  try {
    await client.connect()
    console.log("Hello!"); // This is never ran unless I remove "await" from the above line :S 

    const db = client.db();

    const result = db.collection('states').find({}).map((a, b, c) => {
      console.log("This never runs", a, b, c);
      return "asdf";
    });

    return result;
  } catch (err) {
    console.log("ERROR", err);
  }

  client.close();
};

// Hoisting server
app.get('/api/reports/states/:id', async function (req, res, next) {
  const report = myReport(req.params.id)
  res.json(report); // {}
});

app.listen(PORT, (err) => {
  console.log(`reporting listening in`, PORT);
});

Я действительно не знаю, что я здесь делаю не так. Пытался использовать .each, toArray, и я не могу получить фактические результаты в виде списка.

Я следил за этими документами: https://mongodb.github.io/node-mongodb-native/3.6/api/Cursor.html

Есть идеи, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Согласно вашему высказыванию:
await client.connect() console.log("Hello!"); // This is never ran unless I remove "await" from the above line :S

Я думаю, что соединение не устанавливается. Я попробовал ваш код с небольшими изменениями. Я создал кластер на Atlas Mongodb и использовал его URI в качестве строки подключения.

const express = require('express');
const MongoClient = require('mongodb').MongoClient;
const app = express();
const PORT = 3000;
const MONGO_URI = 'mongodb+srv://<username>:<password>@cluster0-oqotc.mongodb.net/<dbname>?retryWrites=true&w=majority';

 const getListings = async () => {
  const client = new MongoClient(MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true });
  try {
    await client.connect()
    console.log("Hello!"); // This will print now :-) 
    const listings = await client.db("sample_airbnb").collection("listingsAndReviews").findOne({});    
    return listings;
  } catch (err) {
    console.log("ERROR", err);
  }

  client.close();
};


// Hoisting server
app.get('/api/get-listings', async function (req, res, next) {
  const report = await getListings()
  res.json(report); 
});

app.listen(PORT, (err) => {
  console.log(`reporting listening in`, PORT);
});

Вам необходимо изменить имя пользователя, пароль и имя базы данных на свои.
Примечание: При использовании кластера Atlas Mongodb, если вы получаете сообщение об ошибке подключения, вам также необходимо внести свой IP в белый список.
Надеюсь, это вам поможет. Спасибо

1 голос
/ 19 июня 2020

Вы определили myReport как асинхронную функцию, возвращающую обещание. Добавьте toArray () обратно в свой код, а затем получите свой отчет следующим образом

app.get('/api/reports/states/:id', async function (req, res, next) {
  myReport(req.params.id).then(report => {
      res.json(report);
  });
});

Потому что его вызов res. json также находится в асинхронной функции, я думаю, вы также можете сделать

app.get('/api/reports/states/:id', async function (req, res, next) {
  const report = await myReport(req.params.id);
  res.json(report);
});
...