簡體   English   中英

貓鼬對象方法不是函數

[英]mongoose object method is not a function

我正在嘗試創建一條路線來為我的應用程序注冊用戶,但遇到了問題。 當點擊/register路由時,我收到以下錯誤:

TypeError: user.setPassword is not a function at 

這是我的代碼:

模型/用戶.js

var mongoose = require('mongoose');
var crypto = require('crypto');
var jwt = require('jsonwebtoken');

var UserSchema = new mongoose.Schema({
  username: {type: String, lowercase: true, unique: true},
  hash: String,
  salt: String
});

UserSchema.methods.setPassword = function(password){
  this.salt = crypto.randomBytes(16).toString('hex');
  this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
};

UserSchema.methods.validPassword = function(password) {
  var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
  return this.hash === hash;
};

UserSchema.methods.generateJWT = function() {

  // set expiration to 60 days
  var today = new Date();
  var exp = new Date(today);
  exp.setDate(today.getDate() + 60);

  return jwt.sign({
    _id: this._id,
    username: this.username,
    exp: parseInt(exp.getTime() / 1000),
  }, 'SECRET');
};

mongoose.model('User', UserSchema);

路線/ index.js

var express = require('express');
var router = express.Router();
var passport = require('passport');
var mongoose = require('mongoose'); 


var User = mongoose.model('User');

router.post('/register', function(req, res, next){
  if(!req.body.username || !req.body.password){
    return res.status(400).json({message: 'Please fill out all fields'});
  }

  var user = new User();

  user.username = req.body.username;
  user.setPassword(req.body.password);

  user.save(function (err){
    if(err){ return next(err); }

    return res.json({token: user.generateJWT()})
  });
});

module.exports = router;

應用程序.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

//MongoDB Setup
var mongoose = require('mongoose');
require('./models/Users');
mongoose.connect('mongodb://localhost/images');

var passport = require('passport');
require('./config/passport');

var routes = require('./routes/index');
var app = express();
app.use(passport.initialize());
.
.
.
module.exports = app;

我對 MEAN 堆棧相當陌生,在搜索代碼幾個小時后,我不明白為什么會出錯。

下面是我的代碼,它對我有用。

 -----User Model const mongoose = require('mongoose'); const validator = require('validator'); const bcrypt = require('bcryptjs'); const jwt = require('jsonwebtoken'); const userSchema = new mongoose.Schema({ name:{ type: String, required: [true, 'Pleae enter your name'] }, email:{ type: String, required: [true, 'Please enter your email address'], unique: true, validate: [validator.isEmail, 'Please enter a valid email address'] }, role: { type: String, enum:{ values: ['user', 'employer'], message : 'Please select your role' }, //required: [true, 'Please select role that is required'], default: 'user' }, password :{ type: String, required: [true, 'Please enter password for your account'], minlength: [8, 'Your password must be at leeast 8 characters long'], select: false }, createdAt: { type: Date, default: Date.now }, resetPasswordToken: String, resetPasswordExpire: Date }); //Encryting Passwords before Saving userSchema.pre('save', async function(next){ this.password = await bcrypt.hash(this.password, 10); }); //Return JSON web token userSchema.methods.getJwtToken = function(){ return jwt.sign({id: this._id}, process.env.JWT_SECRET, { expiresIn: process.env.JWT_EXPIRES_TIME }); } //Compare password in database userSchema.methods.comparePassword = async function(enterPassword){ return await bcrypt.compare(enterPassword, this.password); } module.exports = mongoose.model('User', userSchema); -----Auth Controller const User = require('../models/users'); const catchAsyncErrors = require('../middlewares/catchAsyncErrors'); const ErrorHandler = require('../utils/errorHandler'); //Register a new user ==> /api/v1/user/register exports.registerUser = catchAsyncErrors(async(req, res, next) => { const { name, email, password, role} = req.body; const user = await User.create({ name, email, password, role }); //Create JWT Token const token = user.getJwtToken(); res.status(200).json({ succes: true, message: 'User created succesfully', data: user, token: token }) }); //Loguin user => /api/v1/login exports.loginUser = catchAsyncErrors( async(req, res, next) =>{ const { email, password } = req.body; if(!email || !password){ return next (new ErrorHandler('Please enter email and password'), 400); } //Finding user in database const user = await (await User.findOne({email})).isSelected('+password'); if(!user){ return next(new ErrorHandler('Invalid Email or Password', 401)); } //Check if passwoerd is correct const isPasswordMatched = await user.comparePassword(password); if(!isPasswordMatched){ return next (new ErrorHandler('Invalid Email or Password', 401)); } //Create JSOBN Web Token const token = user.getJwtToken(); res.status(200).json({ succes: true, token }) })

嘗試這樣做:

模型/用戶.js

var mongoose = require('mongoose');
var crypto = require('crypto');
var jwt = require('jsonwebtoken');

var UserSchema = new mongoose.Schema({
  username: {type: String, lowercase: true, unique: true},
  hash: String,
  salt: String
});

UserSchema.methods.setPassword = function(password){
  this.salt = crypto.randomBytes(16).toString('hex');
  this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
};

UserSchema.methods.validPassword = function(password) {
  var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
  return this.hash === hash;
};

UserSchema.methods.generateJWT = function() {

  // set expiration to 60 days
  var today = new Date();
  var exp = new Date(today);
  exp.setDate(today.getDate() + 60);

  return jwt.sign({
    _id: this._id,
    username: this.username,
    exp: parseInt(exp.getTime() / 1000),
  }, 'SECRET');
};

// exports the user schema
module.exports = mongoose.model('User', UserSchema);

路線/ index.js

var express = require('express');
var router = express.Router();
var passport = require('passport');
var mongoose = require('mongoose'); 
var User = require('models/user'); // require the user model in the correct path

// line removed
//var User = mongoose.model('User');

router.post('/register', function(req, res, next){
  if(!req.body.username || !req.body.password){
    return res.status(400).json({message: 'Please fill out all fields'});
  }

  var user = new User();

  user.username = req.body.username;
  user.setPassword(req.body.password);

  user.save(function (err){
    if(err){ return next(err); }

    return res.json({token: user.generateJWT()})
  });
});

module.exports = router;

讓我知道這是否有效。

有趣:始終確保您的文件沒有保存在某個時髦的位置。 我的stylesheets/文件夾中有一個Users.js的副本,這就是我一直在處理的副本。 與此同時, models/中的副本充滿了很容易發現的小錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM