почему метод, объявленный в Mon goose схема не работает - PullRequest
0 голосов
/ 30 января 2020

Итак, вот моя пользовательская схема, где я объявил метод hello для Userschema, который я использую для проверки

//user.model.js
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const UserSchema = new Schema({
  username: {
    type: String,
    required: true,
    unique: true,
    trim: true,
    minlength: 3
  },
  password: { type: String, required: true }
});


UserSchema.methods.hello = () => {
  console.log("hello from method");
};

const User = mongoose.model("User", UserSchema);

module.exports = User;

здесь файл маршрутов

//authroutes.js
const router = require("express").Router();
let User = require("../models/user.model");

router.route("/").get((req, res) => {
  res.send("auth route");
});

router.route("/signup").post((req, res) => {
  const username = req.body.username;
  const password = req.body.password;

  const newUser = new User({
    username,
    password
  });

  newUser
    .save()
    .then(() => res.json(`${username} added`))
    .catch(err => console.log(err));
});

router.route("/login").post(async (req, res) => {
  await User.find({ username: req.body.username }, function(err, user) {
    if (err) throw err;

    //this doesnt work
    user.hello();
    res.end();
  });
});

module.exports = router;

в маршруте входа в систему, который я вызываю hello функция для тестирования, но она не работает и выдает эту ошибку

TypeError: user.hello не является функцией

1 Ответ

1 голос
/ 30 января 2020

Вам нужно использовать User.findOne вместо User.find, потому что find возвращает массив, но нам нужен экземпляр модели.

Также Методы экземпляра mustn ' быть объявлено с использованием функций стрелок ES6. Функции стрелок явно препятствуют связыванию этого, поэтому у вашего метода не будет доступа к документу, и он не будет работать.

Поэтому вам лучше обновить метод следующим образом:

UserSchema.methods.hello = function() {
  console.log("hello from method");
};
...