简体   繁体   English

用于护照本地注册表单的Node.js app.post不起作用

[英]Node.js app.post for passport-local signup form not working

I'm trying to setup passport local sign-in but the form doesn't do anything when submitted. 我正在尝试设置护照本地登录,但是提交时表格不做任何事情。

My app.js code: 我的app.js代码:

var express = require('express');

var app = express();
app.use(express.static(__dirname + '/public'));
var credentials = require('./credentials.js');
app.use(require('cookie-parser')(credentials.cookieSecret));
app.use(require('body-parser').urlencoded({extended: false}));
var session = require('express-session');
app.use(session({
    resave: false,
    saveUninitialized: true,
    secret: 'keyboard cat'
}));
var passport = require('passport');
app.use(passport.initialize());
app.use(passport.session());

app.disable('x-powered-by');

var handlebars = require('express-handlebars').create({defaultLayout:'main'});

app.engine('handlebars', handlebars.engine);
app.set('view engine', 'handlebars');

app.set('port', process.env.PORT || 3000);
app.post('/login', function(req, res){console.log("body parsing", req.body)});

app.get('/login', function(req, res) {
    res.render('login');
});

The form html at /login for sign-ins: / login上的html格式用于登录:

<form action="/login" method="post">
    <div>
        <label>Username:</label>
        <input type="text" name="username"/>
    </div>
    <div>
        <label>Password:</label>
        <input type="password" name="password"/>
    </div>
    <div>
        <button type="submit">Submit</button>
    </div>
</form>

When I fill in username and password nothing prints out into the console from the post request. 当我填写用户名和密码时,发帖请求中没有任何内容打印到控制台中。 What do I have wrong? 我有什么问题?

You have to serialize and deserialize the user details to make the user authenticated. 您必须序列化和反序列化用户详细信息以使用户通过身份验证。

Here's and example. 这是示例。

services.js services.js

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/user');

//serialize and deserialize
passport.serializeUser(function(user, done) {
    done(null, user._id);
});

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

//middleware
passport.use('local-login', new LocalStrategy({
    usernameField: 'email',
    password: 'password',
    passReqToCallback: true
}, (req, email, password, done) => {
    User.findOne({ email: email.toLowerCase() }, function(err, user) {
        if (err) return done(err);

        if (!user) {
            return done(null, false, req.flash('loginMessage', 'No user has been found'));
        }

        if (!user.comparePassword(password)) {
            return done(null, false, req.flash('loginMessage', 'Oops! Wrong Password.'));
        }
        return done(null, user);
    });
}));

//custom function to validate
exports.isAuthenticated = function(req, res, next) {
    if (req.isAuthenticated()) {
        return next();
    }
    res.redirect('/login');
}

and once you do the serializing, you have to actually apply the process to the router. 并且一旦完成序列化,就必须将该过程实际应用于路由器。 ie, make the user details enter passport. 即,使用户详细信息输入护照。

In your router file: 在您的路由器文件中:

const passportConfig = require('services.js');

Then you can simply access the data via req.user 然后,您可以简单地通过req.user访问数据

I found that removing this AMP js script solves the issue. 我发现删除此AMP js脚本可以解决此问题。 For some reason it breaks the post requests. 由于某种原因,它中断了发布请求。

<script async src="https://cdn.ampproject.org/v0.js"></script>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM