User.find не является функцией и не может перезаписать модель пользователя после компиляции - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь научиться использовать mon goose + mongoDB + next + express в тестовом проекте. Я посмотрел некоторые решения здесь (например, Невозможно перезаписать модель после компиляции Mon goose и другие подобные), но в моем случае это не работает.

Для первого запуска есть появляется ошибка «User.find не является функцией», а после перезагрузки сервера (например, путем сохранения изменений) появляется ошибка «Невозможно перезаписать users модель после компиляции»

Я использую nvm 10.18 .0, следующий 9.3.4, express 4.17.1, пн goose 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

Как я могу решить эти ошибки?

PS Есть скриншоты ошибок: isn't a function, part 1 isn't a function, part 2


OverwriteModelError, part 1 OverwriteModelError, part 2

1 Ответ

0 голосов
/ 10 апреля 2020

Мои коллеги помогают мне понять. Нет никакого способа использовать модель во внешнем интерфейсе. Если создать серверную функцию следующим образом:

//./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()
...
})

Все будет работать нормально!

Спасибо вам так много помощи!

...