Node.js和Mongodb-TypeError:undefined不是一个函数 [英] Node.js and Mongodb - TypeError: undefined is not a function

查看:103
本文介绍了Node.js和Mongodb-TypeError:undefined不是一个函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的朋友和我正在尝试使用Node.js和MongoDB创建一个基本的Web应用程序,并且在尝试连接到数据库时遇到了问题.我们收到的错误如下:

my friend and I are trying to create a basic webapp with Node.js and MongoDB, and we've ran into a problem while trying to connect to the database. The error that we're receiving is as follows:

C:\ Users \ James Kienle \ Dropbox \ Apps \ Azure \ Hanky-Ranky \ server.js:24 mongoClient.open(function(err,mongoClient){//C ^ TypeError:undefined不是一个函数 在对象. (C:\ Users \ James Kienle \ Dropbox \ Apps \ Azure \ Hanky-Ranky \ server.js:24:13) 在Module._compile(module.js:460:26) 在Object.Module._extensions..js(module.js:478:10) 在Module.load(module.js:355:32) 在Function.Module._load(module.js:310:12) 在Function.Module.runMain(module.js:501:10) 在启动时(node.js:129:16) 在node.js:814:3

C:\Users\James Kienle\Dropbox\Apps\Azure\Hanky-Ranky\server.js:24 mongoClient.open(function(err, mongoClient) { //C ^ TypeError: undefined is not a function at Object. (C:\Users\James Kienle\Dropbox\Apps\Azure\Hanky-Ranky\server.js:24:13) at Module._compile (module.js:460:26) at Object.Module._extensions..js (module.js:478:10) at Module.load (module.js:355:32) at Function.Module._load (module.js:310:12) at Function.Module.runMain (module.js:501:10) at startup (node.js:129:16) at node.js:814:3

这是server.js,这是我们的主文件

Here's server.js, our main file

// Bring in required references
var http = require('http'),
    express = require('express'),
    path = require('path'),
    MongoClient = require('mongodb').MongoClient,
    Server = require('mongodb').Server,
    CollectionDriver = require('./collectionDriver').CollectionDriver;

// Set the default port for the app
var port = process.env.PORT || 1337;

// Create the new express app and set all required variables such as port and static html path
var app = express();
app.set('port', port); 
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// Connect to MongoDB
var mongoHost = 'ds040898.mongolab.com'; //A
var mongoPort = 40898; 
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("MongoLab-0");  //E
  db.authenticate('testuser', 'testpassword', function(err, result) {
    collectionDriver = new CollectionDriver(db); //F
  });
});

// Set up the expressjs public path
app.use(express.static(path.join(__dirname, 'public')));

// BRING IN THE DATA
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
              }
         }
    });
});

app.get('/:collection/:entity', function(req, res) { //I
   var params = req.params;
   var entity = params.entity;
   var collection = params.collection;
   if (entity) {
       collectionDriver.get(collection, entity, function(error, objs) { //J
          if (error) { res.send(400, error); }
          else { res.send(200, objs); } //K
       });
   } else {
      res.send(400, {error: 'bad url', url: req.url});
   }
});

// Pull the template for a 404 page
app.use(function (req,res) {
    res.render('404', {url:req.url}); 
});

// Create the node server
http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

这是CollectionDriver.js

And here's CollectionDriver.js

// Import the required MongoDB Packages
var ObjectID = require('mongodb').ObjectID;

// Define the CollectionDriver constructor method for later use
CollectionDriver = function(db) {
  this.db = db;
};

// Fetch a collection by name
CollectionDriver.prototype.getCollection = function(collectionName, callback) {
  this.db.collection(collectionName, function(error, the_collection) {
    if( error ) callback(error);
    else callback(null, the_collection);
  });
};

// Return all found objects
CollectionDriver.prototype.findAll = function(collectionName, callback) {
    this.getCollection(collectionName, function(error, the_collection) { //A
      if( error ) callback(error);
      else {
        the_collection.find().toArray(function(error, results) { //B
          if( error ) callback(error);
          else callback(null, results);
        });
      }
    });
};

// Obtain and display a single item vie _id
CollectionDriver.prototype.get = function(collectionName, id, callback) { //A
    this.getCollection(collectionName, function(error, the_collection) {
        if (error) callback(error);
        else {
            var checkForHexRegExp = new RegExp("^[0-9a-fA-F]{24}$"); //B
            if (!checkForHexRegExp.test(id)) callback({error: "invalid id"});
            else the_collection.findOne({'_id':ObjectID(id)}, function(error,doc) { //C
                if (error) callback(error);
                else callback(null, doc);
            });
        }
    });
};

exports.CollectionDriver = CollectionDriver;

这是我们的package.json文件.据我所知,此文件中列出的所有依赖项均已正确安装

And here's our package.json file. All of the dependencies listed in this file have been installed properly to my knowledge

{
  "name": "hanky-ranky",
  "version": "1.0.0",
  "private": true,
  "dependencies": {
    "express": "4.13.3",
    "jade": "1.11.0",
    "mongodb":"2.0.42"
  }
}

如果有帮助,我正在尝试遵循此网站上的教程: http://www.raywenderlich.com/61078/write-simple-node-jsmongodb-web-service-ios-app

If it helps, I'm trying to follow a tutorial from this website: http://www.raywenderlich.com/61078/write-simple-node-jsmongodb-web-service-ios-app

谢谢大家!非常感谢您的帮助!

Thanks guys! Really appreciate the help!

推荐答案

本教程中使用的mongodb版本为 1.3.23 .您的mongodb版本是2.0.42.似乎实现方式已更改.

The mongodb version used in the tutorial is 1.3.23. Your mongodb version is 2.0.42. Seems like implementation is changed.

这是您连接到2.0版本的mongodb的方式:

This is how you connect to mongodb in 2.0 version:

var MongoClient = require('mongodb').MongoClient;
// Connection url
var url = 'mongodb://localhost:27017/test';
// Connect using MongoClient
MongoClient.connect(url, function(err, db) {
   // Use the admin database for the operation
   var adminDb = db.admin();
   // List all the available databases
   adminDb.listDatabases(function(err, dbs) {

   });
});

您必须稍微更改代码才能使用新版本,或者必须安装mongodb 1.3.23.

You will have to change the code slightly to work with the new version or you will have to install mongodb 1.3.23.

您可以在以下位置获取更多详细信息: http://mongodb.github.io/node-mongodb-native/2.0/

You can get more details at: http://mongodb.github.io/node-mongodb-native/2.0/

这篇关于Node.js和Mongodb-TypeError:undefined不是一个函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆