【问题标题】:REST API new users not posting to MongoDBREST API 新用户未发布到 MongoDB
【发布时间】:2020-03-31 12:57:57
【问题描述】:

我是构建 REST API 的新手,我正在尝试将新的用户信息输入到一个名为“用户”的集合中,但是,当我提交信息时,我得到了 Cannot POST /register

下面是我的代码

server.js

require('dotenv').config()

const express = require('express') 
const app = express()
const mongoose = require('mongoose')
const expressValidator = require('express-validator')


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)

const userRouter = require('./routes/users')
app.use('/register', userRouter)

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.listen(3000, () => console.log('Server Started'))

用户模型

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

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

    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)
    });
}

用户路线

const express = require('express')
const router = express.Router()
const Users = require('../models/users')
const passport = require('passport')
const LocalStrategy = require('passport-local').Strategy

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

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

//Register - POST
router.post('/', (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 valid email is required').isEmail();
    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,
        });

        User.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){
    Users.getUserByEmail(email, function(err, Users){
        if(err) throw err;
        if(!Users){
            return done(null, false, {message: 'Unknown Email Address'});
        }

        Users.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(function(id, done) {
    Users.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 

我怀疑路由器 /register 和我的“用户”集合之间存在冲突。我只是无法确定问题可能是什么。

任何帮助将不胜感激

【问题讨论】:

    标签: javascript node.js mongodb express passport.js


    【解决方案1】:

    您的userRouter 安装在/users 上(来自您的代码:app.use('/users', userRouter),这意味着您在路由器中声明的所有路由都以/users 为前缀)。 尝试拨打POST /users/register

    【讨论】:

    • 我在本地做这一切,所以我在localhost:5000/Users 输入用户信息。你是说我应该改用localhost:5000/Users/register 吗?
    • 是的,正是:)
    • 如果想发帖到http://localhost:5000/register,我需要更改什么?
    • 不要在userRouter上挂载注册路由。你可以简单地做app.post('/register', handleRegister) 或类似的。
    【解决方案2】:

    您在 /users 路由中使用用户路由文件,因此当您在用户路由文件中声明 /register 路由时,它变为 /users/register 请将您的 REST API 请求发送到 /users/register 端点

    【讨论】:

    • 我在上面评论过,但我也会在这里做,因为我很困惑。我在本地做这一切,所以我在 localhost:5000/Users 输入用户信息。你是说我应该改用 localhost:5000/Users/register 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 2013-10-30
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多