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

时间:2020-06-30 22:15:32

标签: node.js mongodb amazon-elastic-beanstalk mongodb-atlas

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

TypeError:无法读取未定义的属性“ find”

我不确定如何追踪我遇到的这个问题。

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);
    });
  

1 个答案:

答案 0 :(得分:0)

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

为了说明这一点,请在连接之前,回调内部以及查找之前添加日志消息。我相信您会发现在给database赋值的回调之前会调用find。

这可能在本地起作用,因为连接完成速度足够快,这要在调用find之前完成,但是在连接到云中的服务器时需要花费几毫秒(也许几十毫秒)的时间。即这是一种竞赛条件。

您可以尝试将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);
      });
  });