【问题标题】:mongoose.connect undefined is not a functionmongoose.connect undefined 不是函数
【发布时间】:2015-06-12 22:45:59
【问题描述】:

我正在尝试使用 node.js、React、ReactRouter 和 webpack 在 c9.io 中建立一个基本的猫鼬连接。我已经建立并监听了我的 mongodb,但是当我尝试要求 mongoose 并启动连接时,它失败并告诉我“未定义不是函数”,指向“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 而不是服务器端的东西。

【问题讨论】:

  • 您是否尝试打印 mongoose 变量?
  • 您是从网页还是从 Node 尝试此操作?您将无法从客户端使用猫鼬。它仅适用于 NodeJS。
  • 这一切都来自Node。
  • @RichardHerbert 你能解决这个问题吗?我也面临同样的问题。
  • 同样的问题,你能解决这个问题吗,@RichardHerbert?

标签: javascript node.js mongodb mongoose reactjs


【解决方案1】:

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

你只能在服务器端需要这个(例如你的“server.js”文件)。

【讨论】:

  • 我也遇到了这个问题。你能解释一下为什么它只能在服务器端需要吗?假设我不关心凭据或其他任何可见的东西 - 我只想连接并获取数据 - React 组件不是全部​​可能吗?
【解决方案2】:

React 是客户端,所以为 mongoose 创建一个 express 服务器,我花了几个小时遇到了同样的问题,找到了一个好的解决方案。

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

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

无需在package.json上放任何东西,无需担心CORS,

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

在一个端口上启动你的 express 服务器,比如说 3030,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'并创建一个文件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 });
        });

    }

瞧!经过几个小时的阅读,它很容易完成。

【讨论】:

    【解决方案3】:

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

    npm install mongoose --save

    【讨论】:

    • 'mongoose' 打印为对象就好了,我尝试重新安装依赖项,但问题仍然存在。由于某种原因,它无法识别 mongoose 对象上的方法。同样,这让我相信这是 webpack 的问题。
    • 在我的情况下也是同样的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2020-10-12
    • 2015-10-29
    • 2015-06-05
    • 2019-10-16
    • 2015-10-16
    • 2013-05-17
    相关资源
    最近更新 更多