Node.jsでMongoDBを使用する方法を見つけようとしてきましたが、ドキュメントでは、コールバックを使用することが推奨される方法のようです。今、私はそれが好みの問題であることを知っていますが、私は本当に約束を使うことを好みます。
問題は、MongoDBでそれらを使用する方法を見つけられなかったことです。実際、私は次のことを試しました:
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/example';
MongoClient.connect(url).then(function (err, db) {
console.log(db);
});
そして、結果はundefined
です。その場合、これはそうする方法ではないようです。
Node内でmongo dbをコールバックの代わりにプロミスで使用する方法はありますか?
あなたのアプローチはほぼ正しい、あなたの議論のほんの小さな間違い
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) {})
上記の回答では、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});
お役に立てば幸いです。これを改善するための提案があれば、私は自分自身を改善したいと思っているので教えてください:)
これはNode.jsでpromiseでMongoDBを使用する方法?の一般的な答えです
コールバックパラメーターが省略された場合、mongodbはpromiseを返します
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) {})
警告編集:
ジョン・カルビナーが指摘したように、この答えは非推奨です。ドライバーを使用すると、OOTBが約束されます。
Promiseライブラリとしてbluebirdを使用することを選択した場合、MongoClientでbluebirds promisifyAll()
関数を使用できます。
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);
});
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
}
MongoDBを使用した作業ソリューションバージョン> 3.
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)
})
mongodb-promise
などの代替パッケージを使用するか、その周りに独自のプロミスを構築するか、 bluebird.promisify
などのプロミスユーティリティパッケージを使用して、mongodb
パッケージAPIを手動で約束することができます。
Connectメソッドにはpromiseインターフェースが定義されていないようです
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>);
Mongoに接続するプロミスを作成する必要があります。
次に、このプロミスを使用する関数を定義します:myPromise.then(...)
。
例えば:
function getFromMongo(cb) {
connectingDb.then(function(db) {
db.collection(coll).find().toArray(function (err,result){
cb(result);
});
});
}
完全なコードは次のとおりです。