mongoose.connect undefined不是一个函数

时间:2015-04-08 05:42:27

标签: javascript node.js mongodb mongoose reactjs

我正在尝试使用node.js,React,ReactRouter和webpack在c9.io中建立基本的mongoose连接。我已经建立了mongodb并且正在监听,但是当我尝试要求mongoose并开始连接时,它失败并且告诉我“undefined不是函数”,指向我“mongoose.connect”。这是我的代码。我不确定我做错了什么。

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017');//this returns "undefined is not a function" and fails
var Schema = mongoose.Schema;

var postSchema = new Schema({
    title: String,
    description: String,
    author: String,
    content: String
});

var Post = mongoose.model('Post', postSchema);

module.exports = Post;

有什么想法?我想知道webpack是否存在问题,因为我使用的是React-router而不是服务器端。

3 个答案:

答案 0 :(得分:11)

如果您在客户端代码中需要此文件(例如,在React组件中),那么是的,这就是问题。

您只能在服务器端(例如,您的“server.js”文件)中要求这样做。

答案 1 :(得分:0)

该错误意味着您正在调用不存在的方法。 我会再次安装mongoose模块:

npm install mongoose --save

答案 2 :(得分:0)

React是客户端,因此为猫鼬创建一个快递服务器,我花了几个小时就遇到了同样的问题,并且找到了一个好的解决方案。

  

我正在尝试使用node.js,React,ReactRouter和webpack在c9.io中建立基本的猫鼬连接。   好吧,

MERN非常棒。 我唯一的问题是我不能在React端使用Mongoose,遇到了这个问题,几个小时后,我找到了一个更好的解决方案,

无需在package.json上放置任何内容,无需担心CORS,

这是一个使用mongoose进行用户注册的工作示例(mongoose永远不会在客户端运行,不浪费时间,修改库很耗时),

在某个端口(例如3030)上启动您的Express服务器,React在3000上运行,

在React端

constructor(){ 
...
  this.server = server || 'https://my.ip.add.ress:3030'
...
}

register(username, password, signup = true) { 
return this.fetch(`${this.server}/server/register`, {
            method: 'POST',
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
                username,
                password,
                signup
            })
        }).then(res => { console.log(res);
            this.setToken(res.token) // Setting the token in localStorage
            return Promise.resolve(res);
        })
}

在Node.JS服务器(快速)端,

创建一个文件夹“服务器”并创建一个文件server.js,

var MongoNode   = require('mongoosenode')   // I created this package for just to test mongoose which doesn't run on React side, 
var cors        = require('cors');  //use cors for cross-site request

var options = {
        key     : fs.readFileSync('server.key'),
        cert    : fs.readFileSync('server.cert'),
    };

    /*
     * Cors Options
     */ 
    var whitelist = config.allowedOrigins //put https://my.ip.add.ress:3000 in the allowedOrigins array in your config file
    var corsOptions = {
        origin: function (origin, callback) {
            if (whitelist.indexOf(origin) !== -1) {
                callback(null, true)
            } else {
                callback(new Error('Not allowed by CORS'))
            }
        }
    }
    //specify the port
    var https_port = config.server.port || 3030;

    //use app or any route included to server.js
     app.post('/register', cors(corsOptions),function(req, res) {
        //Process requests
        console.log(req.body);  //see if request payload popping up
        var mn = new MongoNode('mongodb://username:password@127.0.0.1:27017/databasename')

        var user = mn.retrieveModel('User','User').then(async(res) => { 
           try { 
             user = res.model;
              console.log(user);
              user.username = req.body.username
              user.password = req.body.password
              user.token = token_str  //jwt web token to save browser cookie 
              user.save(function(err) {
                 if (err) throw err;
                 console.log('user saved successfully');
                 res.json({ success: true, token: user.token});
              });                  

           }catch(e) { 
             console.log(e);
           }
        })

        user.save(function(err) {
            if (err) throw err;
            //console.log('user saved successfully');
            res.json({ success: true , message: 'user saved successfully', token : user.token });
        });

    }

Voila!经过几个小时的阅读,即可轻松完成。