【问题标题】:MEAN App error expected objectMEAN App错误预期对象
【发布时间】:2018-02-17 08:26:12
【问题描述】:

我正在尝试编写一个普通的身份验证应用程序。现在我可以通过邮递员在 mongodb 中创建用户,但是当我尝试对其进行身份验证时,如果它的用户名或密码错误,它会给出正确的反馈,错误的密码等,但如果它与数据库上的正确用户名和密码匹配,服务器关闭,它不会对邮递员提供任何反馈,并在服务器终端上给出以下错误:

(node:11262) DeprecationWarning: Mongoose: mpromise (mongoose's 
default promise library) is deprecated, plug in your own promise 
library instead: http://mongoosejs.com/docs/promises.html
/home/cagdas/Desktop/basictest/node_modules/jsonwebtoken/sign.js:90
throw err;
^

Error: Expected object
    at validate 
(/home/cagdas/Desktop/basictest/node_modules/jsonwebtoken
/sign.js:35:11) at Object.module.exports [as sign] 
(/home/cagdas/Desktop/basictest/node_modules/jsonwebtoken
/sign.js:101:7) at User.comparePassword 
(/home/cagdas/Desktop/basictest/routes/users.js:40:26)
at bcrypt.compare (/home/cagdas/Desktop/basictest/models/user.js:52:6)
at 
/home/cagdas/Desktop/basictest/node_modules/bcryptjs/dist
/bcrypt.js:297:21
at /home/cagdas/Desktop/basictest/node_modules
/bcryptjs/dist/bcrypt.js:1353:21
at Immediate.next (/home/cagdas/Desktop/basictest/node_modules
/bcryptjs/dist/bcrypt.js:1233:21)
at runCallback (timers.js:672:20)
at tryOnImmediate (timers.js:645:5)
at processImmediate [as _immediateCallback] (timers.js:617:5)

这是我的代码: app.js:

const express = require('express') ;
const path = require('path');
const bodyParser = require('body-parser');
const cors = require('cors');
const passport = require('passport');
const mongoose = require('mongoose');
const config = require('./config/database');


// Connect to Database
mongoose.connect(config.database, { useMongoClient: true });


// On Connection
mongoose.connection.on('connected', () => {
console.log('Connected to database '+config.database);
});

// On Error
mongoose.connection.on('error', (err) =>{
console.log('Database error: '+err);
});

const app = express();

const users = require('./routes/users');

// Port Number
const port = 3000;

// Cors Middleware
app.use(cors());

// Set Static Folder
app.use(express.static(path.join(__dirname, 'public')));

// Body Parser Middleware
app.use(bodyParser.json());

// Passport Middleware
app.use(passport.initialize());
app.use(passport.session());

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

app.use('/users', users);

// Index Route
app.get('/', (req, res) => {
res.send('Invalid Endpoint');
});

// Start Server
app.listen(port, () => {
console.log('Server started on port '+port);    
});

users.js:

const express = require('express');
const router = express.Router();
const passport = require('passport');
const jwt = require('jsonwebtoken');
const User = require('../models/user');
const config = require('../config/database');

// Register
router.post('/register', (req, res, next) => {
let newUser = new User({
    name: req.body.name,
    email: req.body.email,
    username: req.body.username,
    password: req.body.password
});

User.addUser(newUser, (err, user) =>{
    if(err){
        res.json({success: false, msg:'Failed to register user'});
    } else {
        res.json({success: true, msg:'User registered'});
    }
});
});

// Authenticate
router.post('/authenticate', (req, res, next) => {
const username = req.body.username;
const password = req.body.password;

User.getUserByUsername(username, (err, user) => {
    if(err) throw err;
    if(!user){
        return res.json({success: false, msg: 'User not found'});
    }

    User.comparePassword(password, user.password, (err, isMatch) => {
        if(err) throw err;
        if(isMatch){
            const token = jwt.sign(user, config.secret, {
                expiresIn: 86400 // 1 day
            });

            res.json({
                success: true,
                token: 'JWT ' +token,
                user: {
                    id: user._id,
                    name: user.name,
                    username: user.username,
                    email: user.email
                }
            });
        } else {
            return res.json({success: false, msg: 'Wrong Password'});
        }
    });
})

});

// Profile
router.get('/profile', (req, res, next) => {
res.send('PROFILE');
});

module.exports = router;

数据库.js:

module.exports = {
    database: 'mongodb://localhost:27017/basictest',
    secret: '123456789'
}

user.js:

const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const config =require('../config/database');

// User Schema
const UserSchema = mongoose.Schema({
name: {
    type: String
},
email: {
    type: String,
    required: true
},
username: {
    type: String,
    required: true
},
password: {
    type: String,
    required: true
}
});


const User = module.exports = mongoose.model('User', UserSchema);


module.exports.getUserById = function(id, callback){
User.findById(id, callback);
}


module.exports.getUserByUsername = function(username, callback){
const query = {username: username}
User.findOne(query, callback);
}

module.exports.addUser = function(newUser, callback){
bcrypt.genSalt(10, (err, salt) => {
    bcrypt.hash(newUser.password, salt, (err, hash) => {
        if(err) throw err;
        newUser.password = hash;
        newUser.save(callback);
    });
});
}


module.exports.comparePassword = function(candidatePassword, hash,      
callback){
bcrypt.compare(candidatePassword, hash, (err, isMatch) => {
    if(err) throw err;
    callback(null, isMatch);
});
}

passport.js

const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const User = require('../models/user');
const config = require('../config/database');


module.exports = function(passport){
let opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');
opts.secretOrKey = config.secret;
passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
    User.getUserById(jwt_payload._id, (err, user) => {
        if(err){
            return done (err, false);
        }
        if(user){
            return done(null, user);
        } else {
            return done(null, false);
        }
    });
}));
}

【问题讨论】:

    标签: javascript mongodb jwt mean-stack bcrypt


    【解决方案1】:

    解决方案 - 不仅仅是用户{ data: user }

    const token = jwt.sign({data: user}, config.secret, {
        expiresIn: 604800 // 1 week
    });
    

    【讨论】:

    • 我从 traversy media 做同样的教程并学习编程,但我不会编程,所以我可以帮助你。在文档 mode_modules 中找到解决方案。 Src - “node_modules/jsonwebtoken/README.md”。你有很多例子。
    • 经过 1 小时的搜索才找到这个!非常感谢!
    【解决方案2】:

    有一段时间遇到同样的错误,我建议你重新创建一个新对象user(出于安全原因没有散列密码)并将其插入到签名函数中。

    let restrictedUser = {
        id: user._id,
        username: user.username,
        name: user.name,
        email: user.email
    }
    
    const token = jwt.sign(restrictedUser, config.secret, {
         expiresIn: "7d"
    })
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      不确定,但你可以试试这个

      "npm remove mongoose"
      

      然后

      "npm install mongoose@4.10.8 --save"
      

      希望对你有帮助.. 谢谢...

      【讨论】:

      • 我刚试过你的答案,但它不起作用。我仍然遇到同样的错误
      • 你用的是哪个版本的mongo?........它对你有用吗..... -> mongoose.connect('mongodb://localhost/myappdatabase');
      • 我正在使用 mongo 3.4,但我不认为它与我的 mongo 有关,因为它可以插入新用户并检查它是否存在。当输入与数据库匹配时出现错误。不正确时我没有任何问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 2013-05-01
      相关资源
      最近更新 更多