User.find 不是函数,一旦编译就无法覆盖“用户”模型

Posted

技术标签:

【中文标题】User.find 不是函数,一旦编译就无法覆盖“用户”模型【英文标题】:User.find is not a function and Cannot overwrite `users` model once compiled 【发布时间】:2020-04-09 09:53:47 【问题描述】:

我正在尝试学习在测试项目中使用 mongoose + mongoDB + next + express。我在这里查看了一些解决方案(例如 Cannot overwrite model once compiled Mongoose 和其他类似的解决方案),但它不适用于我的情况。

首次启动出现错误“User.find is not a function”,重新加载服务器后(例如通过保存更改)出现错误“Cannot overwrite users model 一旦编译”

我用nvm 10.18.0,next 9.3.4,express 4.17.1,mongoose 5.9.7

这是我的文件:

//server.js
const express = require('express');
const next = require('next');

const port = parseInt(process.env.PORT, 10) || 3000;
const dev = process.env.NODE_ENV !== 'production';
const app = next( dev );
const handle = app.getRequestHandler();

const mongoose = require('mongoose');
const cors = require('cors');
const morgan = require('morgan');


app.prepare()
  .then(() => 
    const server = express();
    var mongoDB = 'mongodb://127.0.0.1:27017/admin';
    mongoose.connect(mongoDB);
    mongoose.Promise = global.Promise;
    var db = mongoose.connection;

    db.on('error', console.error.bind(console, 'MongoDB connection error:')); 

    server.use(morgan('combined'));
    server.use(cors());
    server.enable('trust proxy');

    server.get('*', (req, res) => 
        return handle(req, res);
      );

    server.listen(port, (err) => 
      if (err) throw err;
      console.log(`>>> [INFO-SERVER] Ready on http://localhost:$port`);
    );
  )
  .catch((ex) => 
    console.error(ex.stack);
    process.exit(1);
  );

//./models/user.js
var mongoose = require('mongoose');

var Schema = mongoose.Schema;

var SomeModelSchema = new Schema(
    a_string: String,
    a_date: Date
);

const User = mongoose.model('users', SomeModelSchema );

module.exports = User;

//./pages/index.js
const User = require('../models/user');
console.log(User.find())

const Home = () => (
  <div className="container">
    Hello World
  </div>
)

export default Home

如何解决这些错误?

附:有错误截图:


【问题讨论】:

嘿,我现在只能告诉你为什么会发生这种情况,根据我自己的经验:你可能会以某种方式重新编译猫鼬模型user,在其他地方调用mongoose.model("User"...)。当我开始时,这种情况一直发生! find 不是函数这一事实意味着 User 没有被编译。 “发生错误是因为您已经定义了架构,然后您再次定义架构”来自您引用的答案。 你能显示错误吗?它通常指出错误所在的行。 我明白了,可能是一个错误。这里'users',尽量用'Users';从这一行const User = mongoose.model('users', SomeModelSchema ); 您好!非常感谢您的帮助!我将在刚才的问题中添加错误截图 【参考方案1】:

我的同事帮助我理解。没有办法在前端使用模型。如果像这样创建服务器端函数:

//./foo.js    
const User = require('./models/user');

const foo = () => 
    console.log(">>>>>>>>>>>>>>>>>>>>>",User.find(email: 'va@mail.com'))


module.exports = foo;

像这样在服务器中导入和使用它:

//./server.js
const foo = require('./foo')

app.prepare()
  .then(() => 
    const server = express();
    var mongoDB = 'mongodb://127.0.0.1:27017/admin';
    mongoose.connect(mongoDB);
    var db = mongoose.connection;
    foo()
...
)

一切都会好起来的!

非常感谢您的帮助!

【讨论】:

以上是关于User.find 不是函数,一旦编译就无法覆盖“用户”模型的主要内容,如果未能解决你的问题,请参考以下文章

一旦编译了模型“”,就无法覆盖“用户”模型(或者我已经监督了一些事情)[重复]

为啥我在第二次运行测试时在 Mongoose 中收到错误“一旦编译后无法覆盖模型”?

为啥我在第二次运行测试时在 Mongoose 中收到错误“一旦编译后无法覆盖模型”?

java中的保存函数创建新列而不是覆盖

编译期多态和Sfinae

CMD中无法使用GCC编译C程序