ReferenceError:未在server.js护照js中定义用户

问题描述 投票:0回答:1

[由于缺乏经验,以及从不同来源获取一点点的代码,我无法查明为什么得到Reference Error: User is not defined.的原因。输入/提交新用户的信息时会发生错误,因此DB永远不会填充,并且出现以下错误。

错误

ReferenceError: users is not defined
    at /Desktop/REST API/server.js:50:17
    at Layer.handle [as handle_request] (/Desktop/REST API/node_modules/express/lib/router/layer.js:95:5)
    at next (/REST API/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/REST API/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/Desktop/REST API/node_modules/express/lib/router/layer.js:95:5)
    at /Desktop/REST API/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/Desktop/REST API/node_modules/express/lib/router/index.js:335:12)
    at next (/Desktop/REST API/node_modules/express/lib/router/index.js:275:10)
    at /Desktop/REST API/node_modules/body-parser/lib/read.js:130:5
    at invokeCallback (/Desktop/REST API/node_modules/raw-body/index.js:224:16)
    at done (/Desktop/REST API/node_modules/raw-body/index.js:213:7)
    at IncomingMessage.onEnd (/Desktop/REST API/node_modules/raw-body/index.js:273:7)
    at IncomingMessage.emit (events.js:327:22)
    at endReadableNT (_stream_readable.js:1201:12)
    at processTicksAndRejections (internal/process/task_queues.js:84:21)

这是我的代码

路由users.js

const express = require('express')
const router = express.Router()
const Users = require('../models/users')

router.get('/register', (req, res) => {
    res.render('register.hbs', {
        pageTitle: 'register'
    });
});

router.get('/login', (req, res) => {
    res.render('login.hbs', {
        pageTitle: 'login'
    });
});

router.post('/register', (req, res) => {
    var firstName = req.body.firstName;
    var lastName = req.body.lastName;
    var email = req.body.email;
    var password = req.body.password;

    //validations
    req.checkBody('firstName', 'Your First Name is Required').notEmpty();
    req.checkBody('lastName', 'Your Last Name is Required').notEmpty();
    req.checkBody('email', 'A valide email is required').notEmpty();
    req.checkBody('password', 'An Account Passowrd Is Required').notEmpty();

    var errors = req.validationErrors();
    if (errors) {
        res.render('register', {
            errors:errors 
        });
    } else {
        var newUser = new newUser({
            firstName: firstName,
            lastName: lastName,
            email: email,
            password: password,
        });

        newUser.createUser(newUser, function(err, user) {
            if(err) throw(err);
            console.log(user);
        });

        req.flash('success_message', "You are now registered!");
        res.redirect('/login');
    }
});

passport.use(new LocalStrategy({
    email: 'email'
},
function(email, password, done){
    User.getUserByEmail(email, function(err, user){
        if(err) throw err;
        if(!user){
            return done(null, false {message: 'Unknown Email Address'});
        }

        User.comparePassword(password, user.password, function(err, ismatch){
            if(err) throw err:
            if(ismatch){
                return done (null, user); 
            } else {
                return done(null, false, {message: 'Invalid Passowrd'});
            }
        });
    });
}));

passport.serializeUser(function(user, done){
    done(null, user.id);
});

passport.deserializeUser(funtion(id, done){
    User.getUserByID(id, function(err, user) {
        done(err, user) 
    });
}); 

router.post('/login', passport.authenticate('local', {
    successRedirect: '/dashboard',
    failureRedirect: '/login',
    successFlash: 'Welcome'
    failureFlash: 'Invalid Email or Passowrd!'
}), function(req, res) {
    res.redirect('/');
});

router.get('/logout', function(req, res) {
    req.logout();
    req.flash('Success_message', 'You are now logged out!')
    res.redirect('/');
});

module.exports = router 

模型:users.js

const mongoose = require('mongoose')
const bcrypt = require('bcrypt')

var articlesSchema = new mongoose.Schema({
    firstName: String, 
    lastName: String, 
    email: String, 
    password: String, 
    permissionLevel: Number, 
    created: Date}, 
    { collection: 'Users'});

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

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

module.exports.getUserByEmail = function(email, callback){
    var query = {email: email};
    User.findOne(query, callback);
}

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

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

最后是我认为问题所在的server.js:

require('dotenv').config()

const express = require('express') 
const app = express()
const mongoose = require('mongoose')
const bcrypt = require('bcrypt')

mongoose.connect(process.env.DATABASE_URL, { useNewUrlParser: true , useUnifiedTopology: true })
const db = mongoose.connection
db.on('error', (error) => console.error(error))
db.once('open', () => console.log('Connected to Database'))

app.use(express.json())

const articlesRouter = require('./routes/articles')
app.use('/articles', articlesRouter)

app.set('view-engine', 'ejs')
app.use(express.urlencoded({ extended: false }))

app.get('/', (req, res) => {
    res.render('index.ejs')
})

app.get('/login', (req, res) => {
    res.render('login.ejs')
})

app.post('/login', (req, res) => {

})

app.get('/register', (req, res) => {
    res.render('register.ejs')
})

app.post('/register',(req, res) => {
    try{
        const hashedPassword = bcrypt.hash(req.body.password, 10)
        users.push({
            firstName:req.body.firstName,
            lastName:req.body.lastName,
            email: req.body.email,
            password: hashedPassword
        })
        res.redirect('/login')
    } catch {
        res.redirect('/register')
    }
    console.log(users)

})

app.listen(3000, () => console.log('Server Started'))

任何帮助,我们将不胜感激。

javascript node.js mongodb express passport.js
1个回答
0
投票

您正在尝试在server.js L50中执行users.push。没有用户数组,因此出现错误。

如果要创建用户(假设路由为/register,则需要导入用户模型并创建用户。但我看到您已经在用户路线中这样做了。您只需要将这些路由与server.js连接,然后删除此代码IMO。

© www.soinside.com 2019 - 2024. All rights reserved.