【问题标题】:Node.js and mongodb: TypeError: Cannot read property 'findAll' of undefinedNode.js 和 mongodb:TypeError:无法读取未定义的属性“findAll”
【发布时间】:2019-10-20 09:37:12
【问题描述】:

我正在使用 javascript (https://www.raywenderlich.com/2663-how-to-write-a-simple-node-js-mongodb-web-service-for-an-ios-app) 关注这个 Node.js 和 mongodb 教程。

当我从终端运行 node 和 mongodb 然后转到 http://localhost:3000/items 时出现错误。错误似乎在此代码块中:

app.get('/:collection', function(req, res) { //A
   var params = req.params; //B
   collectionDriver.findAll(req.params.collection, function(error, objs) { //C
          if (error) { res.send(400, error); } //D
          else {
              if (req.accepts('html')) { //E
                  res.render('data',{objects: objs, collection: req.params.collection}); //F
              } else {
              res.set('Content-Type','application/json'); //G
                  res.send(200, objs); //H
              }
         }
    });
});

在上面这段代码中,我设置了collectiondriver数据库:

var collectionDriver;
var mongoClient = new MongoClient(new Server(mongoHost, mongoPort)); //B
mongoClient.open(function(err, mongoClient) { //C
  if (!mongoClient) {
      console.error("Error! Exiting... Must start MongoDB first");
      process.exit(1); //D
  }
  var db = mongoClient.db("MyDatabase");  //E
  collectionDriver = new CollectionDriver(db); //F
});

我去 localhost:3000/items 时的错误是:

TypeError: Cannot read property 'findAll' of undefined
    at /Users/username/Documents/NodeTutorial/index.js:32:21
    at Layer.handle [as handle_request] (/Users/username/Documents/NodeTutorial/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/username/Documents/NodeTutorial/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/Users/username/Documents/NodeTutorial/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/Users/username/Documents/NodeTutorial/node_modules/express/lib/router/layer.js:95:5)
    at /Users/username/Documents/NodeTutorial/node_modules/express/lib/router/index.js:281:22
    at param (/Users/username/Documents/NodeTutorial/node_modules/express/lib/router/index.js:354:14)
    at param (/Users/username/Documents/NodeTutorial/node_modules/express/lib/router/index.js:365:14)
    at Function.process_params (/Users/username/Documents/NodeTutorial/node_modules/express/lib/router/index.js:410:3)
    at next (/Users/username/Documents/NodeTutorial/node_modules/express/lib/router/index.js:275:10)

index.js 中的第 32 行以“collectionDriver.findAll”开头。 findAll() 未定义的原因是什么?

localhost:3000/items 中页面的预期输出应如下所示,如教程中所述:

谁能告诉我什么是错的?我使用的是 mongodb 1.3.23 版(就像教程使用的一样)

【问题讨论】:

  • 你添加打开数据库连接的代码了吗?该错误表明未设置collectionDriver。在您链接的文章中,有一些设置代码来初始化此值。这应该超出您在此处粘贴的代码。
  • @AustinGreco 我把代码贴在我设置的地方。

标签: javascript node.js mongodb


【解决方案1】:

Node js 异步运行。在您的情况下,我认为“collectionDriver”在您使用它之前没有被初始化。尝试使用promises 使它们同步。确保在调用 .findAll(...) 之前初始化“collectionDriver”。

希望我的回答有帮助。

【讨论】:

  • 所以当我说“collectionDriver = new CollectionDriver(db)”时,collectionDriver 没有被初始化,就像在代码中一样?
  • 不,它正在被初始化,但在调用 .findAll(..) 方法之前它没有被初始化。这种行为的主要原因是 Node js 的异步特性。对于简单的测试,在 app.get(..) 函数本身中初始化“收集驱动器”。理想情况下,它应该可以工作。如果它有效,那么您可以确认问题的根源。
  • 好的,我按照你的建议做了(在 get() 中初始化 collectionDriver),但是 localhost:3000/items 只显示一对括号 {},而不是原始输出的样子发布。
  • 如果您收到 {} 作为响应,那么很明显您可以连接到数据库。检查代码中的数据库名称和集合名称是否正确。如果它们没问题,您应该能够将内容作为响应返回。你最初的错误现在似乎已经消失了。我猜它是因为异步的性质。
  • 还要检查 mongo db 中的集合名称是否实际上包含任何记录?
猜你喜欢
  • 2021-07-17
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 2016-04-20
  • 1970-01-01
  • 2020-01-23
  • 2020-11-25
相关资源
最近更新 更多