【问题标题】:cannot access mongoose schema static method - typescript无法访问猫鼬模式静态方法 - 打字稿
【发布时间】:2018-04-27 15:01:16
【问题描述】:

我遇到的问题如下 - 有一个名为“findByToken()”的方法,该方法在模型中定义,并在 userSchema 中作为静态方法实现。

在我的应用程序的另一部分,我无法使用以下方法访问该方法: User.findByToken(token) - 你能帮我解决这个问题吗?似乎在任何地方都找不到答案。

import mongoose = require('mongoose');
import validator = require('validator');
import jwt = require('jsonwebtoken');

interface IUser {
  email: string,
  password: string,
  token: any[],
  generateAuthToken(): () => any
}

interface IUserModel extends IUser, mongoose.Document{
  findByToken: (token: any) => any;
  findByCredentials: (email: string, password: string) => any
}

let userSchema = new mongoose.Schema({
  email: {
      type: String,
      required: true,
      minlength: 1,
      trim: true,
      unique: true,
      validate: {
          validator: validator.isEmail,
          message: '{VALUE} is not a valid email'
      }
  },
  password: {
      type: String,
      required: true,
      minlength: 6
  },
  tokens: [{
      access: {
          type: String,
          required: true
      },
      token: {
          type: String,
          required: true
      }
  }]
});

userSchema.statics.findByToken = function(token: string) {
  let User = this; //entire model is binded with .this
  let decoded: any;

  try{
    decoded = jwt.verify(token, 'My Secret');
  } catch(e) {
      return Promise.reject('rejected');
  }

  return User.findOne({
    _id: decoded._id,
    'tokens.token': token,
    'tokens.access': 'auth'
  });
};


let User = mongoose.model<IUserModel>('User', userSchema);

export = User;

我如何称呼静态方法:

import User = require('./../models/user');
import express = require("express");

/*
tsconfig.json:
   "strict": true     will enfore types for req, res, next - etc
*/


//creating our auth private middleware
let authenticate = (req: express.Request, res: express.Request, next: express.Request) => {
    let token = req.header('x-auth');

    //custom model method
    User.findByToken(token).then((user) => {
        // if(!user){
        //     return Promise.reject(); //sends you directly into catch
        // }

        // req.user = user;
        // req.token = token;
        // next();

    }).catch((e) => {
        res.status(401).send();
    });

}

User.find

export = authenticate;

【问题讨论】:

    标签: node.js mongodb typescript express mongoose


    【解决方案1】:
    let User = mongoose.model<IUserModel>('User', userSchema);
    

    应该是:

    let User = mongoose.model<IUser, IUserModel>('User', userSchema);
    

    【讨论】:

      猜你喜欢
      • 2016-08-28
      • 2020-09-11
      • 2016-04-01
      • 2021-10-01
      • 1970-01-01
      • 2023-03-08
      • 2017-01-20
      • 2017-04-11
      • 2014-02-15
      相关资源
      最近更新 更多