Узел / функция экспресс-синхронизации повторно отправляет, появляясь в консоли, а не на странице

#node.js #mongodb #express #async-await

#node.js #mongodb #экспресс #асинхронное ожидание

Вопрос:

У меня есть некоторый код, который получает некоторые данные из базы данных mongo.

Функция внутри express app.get будет отображаться в URL-адресе браузера, но в этом коде результаты отображаются только в консоли, а не на веб-странице, как это должно быть.

Вот код:

 async function showdb() {

    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/";

    MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
      if (err) throw err;
      var dbo = db.db('mydb');
      dbo.collection('test').findOne({}, function(err, result) {
        if (err) throw err;
        console.log(result);
        return resu<
        // res.send(result); // commented out
        // db.close(); // commented out
      });
    });

  }
  

Теперь маршрут:

 app.get('/', (req, res) => {

    showdb().then(result => {
        res.send(result); // result is showing in the console
    })

})
  

res.send(result); данные должны отображаться в браузере, но он показывает их в консоли.

Как я могу это исправить?

Комментарии:

1. Что отображается в консоли? И каков ее тип?

2. Отображается это: { _id: 5c9669ee4f401121adb78209, desc: ‘Это данные’}

Ответ №1:

Обе функции MongoClient.connect() и collection.findOne() возвращают обещание, поэтому вы можете связать их без использования обратных вызовов с меньшим количеством кода:

 function showdb() {

  var MongoClient = require('mongodb').MongoClient;
  var url = "mongodb://localhost:27017/";

  return MongoClient.connect(url, { useNewUrlParser: true })
    .then((db) => {
       return db.db('mydb').collection('test').findOne({});
    });
}
  

Теперь showdb функция вернет обещание вашему маршруту.

Ответ №2:

Вы не указали порт, на котором прослушивается сервер. Попробуйте добавить приведенный ниже код, это может помочь вам

 var app = express();
app.set('port', 3000);
var server= app.listen(app.get('port'), function()

{

    var port = server.address().port;
    console.log(" Iam at Port:"   " "   port);


});
  

Комментарии:

1. Это не так… этот код находится внизу страницы. Если я помещу код showdb внутрь app.get, он будет работать нормально. Похоже, это как-то связано с асинхронностью?