#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, он будет работать нормально. Похоже, это как-то связано с асинхронностью?