Я пытался узнать, как использовать MongoDB с Node.js, и в документах кажется, что предлагаемый способ - использовать обратные вызовы. Я знаю, что это всего лишь вопрос предпочтений, но я действительно предпочитаю использовать обещания.
Проблема в том, что я не нашел, как их использовать с MongoDB. Действительно, я пробовал следующее:
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/example';
MongoClient.connect(url).then(function (err, db) {
console.log(db);
});
И результат есть undefined
. В таком случае, похоже, это не способ сделать это.
Есть ли способ использовать mongo db внутри Node с обещаниями вместо обратных вызовов?
javascript
node.js
mongodb
user1620696
источник
источник
Ответы:
Ваш подход почти правильный, всего лишь крошечная ошибка в ваших аргументах
var MongoClient = require('mongodb').MongoClient var url = 'mongodb://localhost:27017/example' MongoClient.connect(url) .then(function (db) { // <- db as first argument console.log(db) }) .catch(function (err) {})
источник
MongoClient.connect
. Если у вас есть node.js <4 без встроенных обещаний ES6, вы также можете использовать совместимую с ES6 прокладку обещаний или предоставить совместимую с ES6 реализацию обещаний сpromiseLibrary
опциейMongoClient.connect
.mongodb//localhost:27017
(без указания базы данных), вы получаете обратно mongoclient, поэтому вам нужно позвонитьmongoclient.db('example')
. См. Mongodb.github.io/node-mongodb-native/api-generated/…Вы также можете использовать async / await
async function main(){ let client, db; try{ client = await MongoClient.connect(mongoUrl, {useNewUrlParser: true}); db = client.db(dbName); let dCollection = db.collection('collectionName'); let result = await dCollection.find(); // let result = await dCollection.countDocuments(); // your other codes .... return result.toArray(); } catch(err){ console.error(err); } // catch any mongo error here finally{ client.close(); } // make sure to close your connection after }
источник
Поскольку ни один из приведенных выше ответов не упоминает, как это сделать без bluebird или q или любой другой причудливой библиотеки, позвольте мне добавить на это свои 2 цента.
Вот как вы делаете вставку с собственными обещаниями ES6
'use strict'; const constants = require('../core/constants'), mongoClient = require('mongodb').MongoClient; function open(){ // Connection URL. This is where your mongodb server is running. let url = constants.MONGODB_URI; return new Promise((resolve, reject)=>{ // Use connect method to connect to the Server mongoClient.connect(url, (err, db) => { if (err) { reject(err); } else { resolve(db); } }); }); } function close(db){ //Close connection if(db){ db.close(); } } let db = { open : open, close: close } module.exports = db;
Я определил свой метод open () как метод, возвращающий обещание. Чтобы выполнить вставку, вот мой фрагмент кода ниже
function insert(object){ let database = null; zenodb.open() .then((db)=>{ database = db; return db.collection('users') }) .then((users)=>{ return users.insert(object) }) .then((result)=>{ console.log(result); database.close(); }) .catch((err)=>{ console.error(err) }) } insert({name: 'Gary Oblanka', age: 22});
Надеюсь, это поможет. Если у вас есть предложения по улучшению, дайте мне знать, я хочу улучшить себя :)
источник
Это общий ответ на вопрос, как использовать MongoDB с обещаниями в Node.js?
Перед преобразованием в Promise
var MongoClient = require('mongodb').MongoClient, dbUrl = 'mongodb://db1.example.net:27017'; MongoClient.connect(dbUrl,function (err, db) { if (err) throw err else{ db.collection("users").findOne({},function(err, data) { console.log(data) }); } })
После преобразования в Promise
//converted MongoClient.connect(dbUrl).then(function (db) { //converted db.collection("users").findOne({}).then(function(data) { console.log(data) }).catch(function (err) {//failure callback console.log(err) }); }).catch(function (err) {})
Если вам нужно обработать несколько запросов
MongoClient.connect(dbUrl).then(function (db) { /*---------------------------------------------------------------*/ var allDbRequest = []; allDbRequest.push(db.collection("users").findOne({})); allDbRequest.push(db.collection("location").findOne({})); Promise.all(allDbRequest).then(function (results) { console.log(results);//result will be array which contains each promise response }).catch(function (err) { console.log(err)//failure callback(if any one request got rejected) }); /*---------------------------------------------------------------*/ }).catch(function (err) {})
источник
MongoClient.connect(uri).then(client => client.db("db").collection("users").find()).then(data => console.log(data)).catch(err => console.log(err));
ВНИМАНИЕ! Редактировать:
Как заметил Джон Калвинер, этот ответ устарел. Используйте драйвер, он поставляется с обещаниями OOTB.
Если вы решите использовать bluebird в качестве библиотеки обещаний, вы можете использовать
promisifyAll()
функцию bluebirds в MongoClient:var Promise = require('bluebird'); var MongoClient = Promise.promisifyAll(require('mongodb').MongoClient); var url = 'mongodb://localhost:27017/example'; MongoClient.connectAsync(url).then(function (db) { console.log(db); }).catch(function(err){ //handle error console.log(err); });
источник
Я знаю, что немного опаздываю на вечеринку, но я хотел бы поделиться примером с использованием ES6
const config = require('config'); const MongoClient = require('mongodb').MongoClient; var _connection; var _db; const closeConnection = () => { _connection.close(); } /** * Connects to mongodb using config/config.js * @returns Promise<Db> mongo Db instance */ const getDbConnection = async () => { if (_db) { return _db; } console.log('trying to connect'); const mongoClient = new MongoClient(config.mongodb.url, { useNewUrlParser: true }); _connection = await mongoClient.connect(); _db = _connection.db(config.mongodb.databaseName); return _db; } module.exports = { getDbConnection, closeConnection };
Я расскажу немного подробнее здесь, если вы хотите взглянуть:
https://medium.com/swlh/how-to-connect-to-mongodb-using-a-promise-on-node-js-59dd6c4d44a7
источник
Вы можете либо использовать альтернативный пакет, например,
mongodb-promise
либо обещатьmongodb
API пакета вручную, создавая свои собственные обещания на его основе, либо с помощью пакета служебных программ обещаний, напримерbluebird.promisify
источник
Рабочее решение с версией MongoDB > 3.0
var MongoClient = require('mongodb').MongoClient; var url = "mongodb://localhost:27017/"; open = (url) => { return new Promise((resolve,reject) => { MongoClient.connect(url, (err,client) => { //Use "client" insted of "db" in the new MongoDB version if (err) { reject(err) } else { resolve({ client }); }; }); }); }; create = (client) => { return new Promise((resolve,reject) => { db = client.db("myFirstCollection"); //Get the "db" variable from "client" db.collection("myFirstCollection").insertOne({ name: 'firstObjectName', location: 'London' }, (err,result)=> { if(err){reject(err)} else { resolve({ id: result.ops[0]._id, //Add more variables if you want client }); } }); }); }; close = (client) => { return new Promise((resolve,reject) => { resolve(client.close()); }) }; open(url) .then((c) => { clientvar = c.client; return create(clientvar) }).then((i) => { idvar= i.id; console.log('New Object ID:',idvar) // Print the ID of the newly created object cvar = i.client return close(cvar) }).catch((err) => { console.log(err) })
источник
Вам нужно создать обещание, которое подключается к Mongo.
Затем определите функцию , которая использует это обещание:
myPromise.then(...)
.Например:
function getFromMongo(cb) { connectingDb.then(function(db) { db.collection(coll).find().toArray(function (err,result){ cb(result); }); }); }
вот полный код:
http://jsfiddle.net/t5hdjejg/
источник
Вот один лайнер для открытия соединения
export const openConnection = async () => await MongoClient.connect('mongodb://localhost:27017/staticback')
и назовите это так
const login = async () => const client = await openConnection()
источник
Не похоже, что для метода подключения определен интерфейс обещания
http://mongodb.github.io/node-mongodb-native/2.1/tutorials/connect/
вы всегда можете реализовать это самостоятельно в библиотеке коннекторов Mongodb, но это, вероятно, более сложное, чем вы ожидаете.
Если вам действительно нужно работать с обещаниями, вы всегда можете использовать полифилл обещаний ES6:
https://github.com/stefanpenner/es6-promise
и оберните этим свой код подключения. Что-то вроде
var MongoClient = require('mongodb').MongoClient; var Promise = require('es6-promise').Promise; var url = 'mongodb://localhost:27017/example'; var promise = new Promise(function(resolve, reject){ MongoClient.connect(url, function (err, db) { if(err) reject(err); resolve(db); }); }); promise.then(<resolution code>);
источник