2016-05-25 8 views
0

Ich versuche eine Datenbank zu füllen, wenn eine Person ein Konto erstellt. Mein Server befindet sich in node.js. app.js:Wie füllt man eine MySQL-Datenbank aus Dateneinträgen eines Formulars?

var http=require("http"); 
var express = require('express'); 
var app = express(); 
var server = http.createServer(app); 
var bodyParser = require('body-parser'); 
var cookieParser = require('cookie-parser'); 
var session = require('express-session'); 
var bcrypt = require('bcrypt-nodejs'); 
var ejs = require('ejs'); 
var path = require('path'); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 



// routes 
var route = require('./route'); 
// model 
var Model = require('./model'); 




app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'ejs'); 

app.use(cookieParser()); 
app.use(bodyParser.urlencoded({extended:false})); 
app.use(session({secret: 'secret strategic xxzzz code', 
     resave:false, 
     saveUninitialized:false 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 




server.listen(3000,function(){ 
    console.log("server listen at localhost:3000");}); 
passport.use(new LocalStrategy(function(username, password, done) { 
    new Model.User({username: username}).fetch().then(function(data) { 
     var user = data; 
     if(user === null) { 
     return done(null, false, {message: 'Invalid username or password'}); 
     } else { 
     user = data.toJSON(); 
     if(!bcrypt.compareSync(password, user.password)) { 
      return done(null, false, {message: 'Invalid username or password'}); 
     } else { 
      return done(null, user); 



     } 
     } 
    }); 
})); 



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

    passport.deserializeUser(function(username, done) { 
     new Model.User({username: username}).fetch().then(function(user) { 
      done(null, user); 
     }); 
    }); 

    // signup 
    // GET 
    app.get('/signup', route.signUp); 
    // POST 
    app.post('/signup', route.signUpPost); 

route.js:

var signUpPost = function(req, res, next) { 
    var user = req.body; 
    var usernamePromise = null; 
    usernamePromise = new Model.User({username: user.username}).fetch();//verify the existence of username on the database 


    return usernamePromise.then(function(model) { 
     if(model) { 
     res.render('index1', {title: 'Index', errorMessage: 'username already exists'});//verify if the entered username exists in the databas. 
     } else { 
     var password = user.password; 
    var email=user.email; 

    if(password.length<5){ 
     res.render('index1',{title:'index',errorMessage:'password so weak'});//password must been > 5 caracters. 
    } 
    else if(verifMail(email) === false){ 
     res.render('index1',{title:'index',errorMessage:'email invalid'});//if the email is not valid,it show an error 
    } 

    else{ 
     var hash = bcrypt.hashSync(password);//crypt the password 

     var signUpUser = new Model.User({username: user.username, password:hash,email:user.email,firstname:user.firstname,lastname:user.lastname});//add a new row in the database 

     signUpUser.save().then(function(model) { 
      signInPost(req, res, next); 
     }); 
    }; 
     } 
    }); 
}; 

Model.js:

var DB = require('./db').DB; 

var User = DB.Model.extend({ 
    tableName: 'newuser', 
    idAttribute: 'userId', 
}); 

module.exports = { 
    User: User 
}; 

db.js:

var Bookshelf = require('bookshelf'); 

var config = { 
    host: 'localhost', 
    user: 'root', 
    password: '', 
    database: 'Users', 
    charset: 'UTF8_GENERAL_CI' 
}; 

var DB = Bookshelf.initialize({ 
    client: 'mysql', 
    connection: config 
}); 

module.exports.DB = DB; 

Wenn eine Person einen Klick Taste, um sich anzumelden, eine modale Anzeige, um seine erste einzugeben Name, Nachname, E-Mail-Adresse und Passwort.

Die Seite noch für eine lange Zeit neu laden und die Daten wurden nicht in der Datenbank gespeichert.

Antwort

0

Ihre signUpPost-Funktion sollte eine Ansicht oder eine Weiterleitung an eine andere Route zurückgeben, aber stattdessen eine Zusage zurückgeben.

Darüber hinaus sollte eine then() -Funktion immer ein Versprechen oder einen Wert zurückgeben, aber es gibt nichts zurück. Und Sie sollten immer einen Fangblock hinzufügen;

Ich glaube, Sie haben die Art verstanden, wie Promises funktionieren.

//... 
usernamePromise.then(function(model) { 
    if (model) throw new Error('username already exists'); 
    else { 
    //... 
    if(...) { throw new Error('password so weak'); } 
    else if(...) { throw new Error('email invalid'); } 
    else { 
     //... 
     return signUpUser.save(); 
    } 
    } 
}).then(function(model){ 
    // do what you want with model and redirect 
    return res.redirect('/my/new/route'); 
}).catch(function(err){ 
    // do what you want with err (eg: use flash or console.log(err)) and redirect 
    return res.redirect('/my/new/route'); 
}); 
//... 
Verwandte Themen