MongoConnect传递客户为回调
我很困惑,这里的回调。我们返回客户端的承诺,但我们如何执行,在回调?如果客户对象是回调那么是不是在客户端调用客户端?什么是相当于回调?
const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;
const mongoConnect = callback => {
MongoClient.connect(
'mongodb+srv://<user>:<password>@cluster0-ntrwp.mongodb/test?retryWrites=true'
)
.then(client => {
console.log('Connected!');
callback(client);
})
.catch(err => {
console.log(err);
});
};
module.exports = mongoConnect;
(app.js)
mongoConnect(client => {
console.log(client);
app.listen(3000);
});
这不是预期的输出。我有点困惑这里的回调。
const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;
const mongoConnect = client => {
console.log(client);
app.listen(3000); => {
MongoClient.connect(
'mongodb+srv://<user>:<password>@cluster0-ntrwp.mongodb/test?retryWrites=true'
)
.then(client => {
console.log('Connected!');
client => {
console.log(client);
app.listen(3000);(client);
})
.catch(err => {
console.log(err);
});
};
module.exports = mongoConnect;
(app.js)
mongoConnect(client => {
console.log(client);
app.listen(3000);
});
回答如下:
我猜你问的第一个代码是如何工作的。我重写了第一代码使用旧学校function()
代替ES6脂肪箭头,并把一些日志记录,以使其更清晰这是怎么回事:
const express = require('express');
const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;
const app = express();
function mongoConnect(callback) {
MongoClient.connect('mongodb://localhost:27017')
.then(client => {
console.log('[mongoConnect] Connected!');
console.log('[mongoConnect] callback type: ' + typeof(callback));
console.log('[mongoConnect] client type: ' + typeof(client));
console.log('[mongoConnect] client is: ' + client.constructor.name);
callback(client);
})
.catch(err => {
console.log(err);
});
};
mongoConnect(function(client) {
console.log('[main] client type: ' + typeof(client));
console.log('[main] client is: ' + client.constructor.name);
app.listen(3000, function() {
console.log('[main] listening on 3000');
});
});
运行代码:
[mongoConnect] Connected!
[mongoConnect] callback type: function
[mongoConnect] client type: object
[mongoConnect] client is: MongoClient
[main] client type: object
[main] client is: MongoClient
[main] listening on 3000
至于你的问题:
如果客户对象是回调那么是不是在客户端调用客户端?什么是相当于回调?
为了解开这是怎么回事:
client
是一个对象,并且callback
是一个函数。mongoConnect()
接受一个函数作为参数。- 获取传递到
mongoConnect()
该函数接受client
(一个对象)作为参数。从技术上讲,这是没有必要的。我想这是只有在那里审计/日志记录。您可以删除所有提到的那部分代码client
的,并认为它仍然有效。
例如,你可以改变的代码位是:
mongoConnect(function() {
app.listen(3000, function() {
console.log('[main] listening on 3000');
});
});
它仍然会工作方式相同。
执行顺序是:
mongoConnect(function(client))
被称为- 里面
mongoConnect
,MongoClient.connect()
被称为 - 一旦连接,回调(
function(client)
)被称为 - 回调执行
app.listen()
这个流程顺序保证了应用进入侦听模式前的数据库连接。不这样做,被确认之前的任何数据库连接(例如,由于比预期的数据库连接等更慢)的应用可以听。您可以确认通过观察[mongoConnect]
日志行任何[main]
日志行之前总是打印此流程。