为什么在 Mongoose 模式中声明的方法不起作用

why method declared in Mongoose schema wasnt working

所以,这是我的用户模式,我在其中向我用来测试的用户模式声明了 hello 方法

//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 is not a function

你需要使用User.findOne而不是User.find,因为找到returns一个数组,但我们需要的是模型的一个实例。

此外 Instance methods 不应使用 ES6 箭头函数声明。 箭头函数显式地阻止绑定 this,因此您的方法将无法访问文档并且它不会工作。

所以你最好像这样更新方法:

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