代码之家  ›  专栏  ›  技术社区  ›  Tdellard1

TypeError:部署时无法读取未定义的属性“find”,但不能在本地读取

  •  0
  • Tdellard1  · 技术社区  · 5 年前

    我创建了一个MongoDB Atlas集群,将一些数据放在其中,然后创建了一个node/express应用程序来从该集群检索数据。在本地,我能够检索到正确的数据,但当我的节点服务器部署到AWS Elastic Beanstalk时,我会出现以下错误:

    我甚至不知道如何追踪我遇到的这个问题。

    const MongoClient = require('mongodb').MongoClient;
    let database;
    
    MongoClient.connect(
      'url-to-cluster',
      {useNewUrlParser: true, useUnifiedTopology: true},
      (err, client) => {
        const users = client.db('entity');
        database = users.collection('entityinfo');
      });
      
      // Used in app.use method
      database.find().toArray()
        .then(results => {
          res.json(results[0].UID);
        });
      
    0 回复  |  直到 5 年前
        1
  •  0
  •   Joe    5 年前

    MongoClient.connect 是异步的,它将立即返回并仅在连接解析后调用提供的回调。

    为了演示这一点,请在调用connect之前、回调内部以及调用find之前添加日志消息。我相信你会发现,find是在回调之前被调用的,回调将给出 database 一个价值观。

    这很可能在本地起作用,因为连接完成的速度足够快,在调用find之前就完成了,但在连接到云中的服务器时需要几毫秒(可能是几十毫秒)。i、 这是一个比赛条件。

    您可以尝试在回调中包含find调用,比如

    MongoClient.connect(
      'url-to-cluster',
      {useNewUrlParser: true, useUnifiedTopology: true},
      (err, client) => {
        const users = client.db('entity');
        database = users.collection('entityinfo');
      
      // Used in app.use method
        database.find().toArray()
          .then(results => {
            res.json(results[0].UID);
          });
      });
    
    
    推荐文章