MongoConnect传入客户端作为回调

时间:2019-02-04 15:23:46

标签: javascript node.js mongodb

我对这里的回调感到困惑。我们在promise中返回客户,但是我们如何在回调中执行它呢?如果客户端对象是回调,那么客户端不是在调用客户端吗?回调相当于什么?

$productsArr = json_decode($_POST['products']);

这不是预期的输出。我对这里的回调有些困惑。

const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;

const mongoConnect = callback => {
  MongoClient.connect(
    'mongodb+srv://<user>:<password>@cluster0-ntrwp.mongodb.net/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);
});

1 个答案:

答案 0 :(得分:0)

我猜你在问第一个代码是如何工作的。我重新编写了第一个代码,以使用旧式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');
  });
});

,它仍将以相同的方式工作。

执行顺序为:

  1. mongoConnect(function(client))被称为
  2. mongoConnect内,MongoClient.connect()被称为
  3. 连接后,将调用回调(function(client)
  4. 回调执行app.listen()

此流程顺序可确保在应用程序进入侦听模式之前已连接数据库。如果没有此设置,则应用程序可以在确认任何数据库连接之前侦听(例如,由于数据库连接速度比预期的慢等)。您可以通过观察在所有[mongoConnect]日志行之前之前打印[main]日志行来确认此流程。