2016-03-07 55 views
0

我想这样做,当用户输入一个已经在数据库中的电子邮件,让用户知道该帐户的电子邮件已经注册。 我得到了mongo db的正确错误,但我不想显示所有垃圾。我希望它在我的注册页面上显示我的错误,并在表单中显示“此电子邮件地址已被注册”。Req.flash(错误)不显示-NodeJS 5.7.0

MongoDB的响应:

MongoError: E11000 duplicate key error index: jcommerce.users.$email_1 dup key: { : "[email protected]" } 
    at Function.MongoError.create (C:\jcommerce\node_modules\mongodb-core\lib\error.js:31:11) 
    at toError (C:\jcommerce\node_modules\mongodb\lib\utils.js:114:22) 
    at C:\jcommerce\node_modules\mongodb\lib\collection.js:616:23 
    at handleCallback (C:\jcommerce\node_modules\mongodb\lib\utils.js:96:12) 
    at C:\jcommerce\node_modules\mongodb\lib\bulk\unordered.js:470:9 
    at handleCallback (C:\jcommerce\node_modules\mongodb\lib\utils.js:96:12) 
    at resultHandler (C:\jcommerce\node_modules\mongodb\lib\bulk\unordered.js:417:5) 
    at commandCallback (C:\jcommerce\node_modules\mongodb-core\lib\topologies\server.js:936:9) 
    at Callbacks.emit (C:\jcommerce\node_modules\mongodb-core\lib\topologies\server.js:116:3) 
    at null.messageHandler (C:\jcommerce\node_modules\mongodb-core\lib\topologies\server.js:282:23) 
    at Socket.<anonymous> (C:\jcommerce\node_modules\mongodb-core\lib\connection\connection.js:273:22) 
    at emitOne (events.js:90:13) 
    at Socket.emit (events.js:182:7) 
    at readableAddChunk (_stream_readable.js:153:18) 
    at Socket.Readable.push (_stream_readable.js:111:10) 
    at TCP.onread (net.js:529:20) 

路由类

var router = require('express').Router(); 
var User = require('../models/user') 

router.get('/signup', function (req, res, next) { 
    res.render('accounts/signup', { 
     errors: req.flash('errors') 
    }); 
}); 

router.post('/signup', function(req, res, next) { 
     var user = new User(); 

     user.profile.name = req.body.name; 
     user.email = req.body.email; 
     user.password = req.body.password; 

     // Validate 
     User.findOne({email: req.body.email}, function (err, existingUser) { 
      if (existingUser) { 
       req.flash('errors', 'Account with that email address already exists'); 
       return res.redirect('/signup'); 
      } 
      else { 
       // save user to database 
       user.save(function(err, user) { 
        if (err) { 
         return next(err); 
        } 

        return res.redirect('/'); 


       }); 
      } 
     }); // Mongoose method find one document in db 
}); 

module.exports = router; 

EJS

<% layout('layout') -%> 

<div class="row"> 
    <div class="col-lg-6 col-md-offset-3"> 

     <% if (errors.length > 0) { %> 
     <div class="alert alert-danger alert-dismissible"> 
     <button type="button" class="close" data-dismiss="alert" aria-label="Close"> 
      <span aria-hidden="true">&times;</span> 
      </button> 
      <%= errors %> 
      </div> 
    <% } %> 

     <form method="post"> 
      <h1> Signup! </h1> 
      <div class="form-group"> 
      <label="name"> Name: </label> 
      <input type="text" class="form-control" name="name"> 
      </div> 
      <div class="form-group"> 
       <label="name"> Email: </label> 
       <input type="email" class="form-control" name="email"> 
      </div> 
      <div class="form-group"> 
       <label="name"> Password: </label> 
       <input type="passwod" class="form-control" name="password"> 
      </div> 
      <button type="submit" class="btn btn-success"> Submit</button> 
     </form> 
    </div> 
</div> 

Server.js AKA app.js //需要的库,我们要使用

var express = require('express'); 
var morgan = require('morgan'); 
var mongoose = require('mongoose'); 
var bodyParser = require('body-parser'); 
var ejs = require('ejs'); 
var engine = require('ejs-mate'); 
var session = require('express-session'); 
var cookieParser = require('cookie-parser'); // parses cookies and put it on the request object in the middleware 
var flash = require('express-flash'); 

var User = require('./models/user'); 

// App is reffering to express objects, bc we want to use express objects 
var app = express(); 

mongoose.connect('mongodbconnectionstring', function (err) { 
    if (err) { 
     console.log(err); 
    } 
    else 
    { 
     console.log("Connected to the database"); 
    } 
}); 

//Middleware - logs requests in cmd 
app.use(express.static(__dirname + '/public')); 
app.use(morgan('dev')); 
app.use(bodyParser.json()); // Express can parse data format 
app.use(bodyParser.urlencoded({extended: true})); 
app.use(cookieParser()); 
app.use(session({ 
    resave: true, 
    saveUninitialized: true, 
    secret: "[email protected]@@@#" 
})); 
app.use(flash()); 
app.engine('ejs', engine) 
app.set('view engine', 'ejs'); 


// body parser takes the body of request and parses it -> Format encoded or raw data 

var mainRoutes = require('./routes/main'); 
var userRoutes = require('./routes/user'); 
app.use(mainRoutes); // Express is using main routes 
app.use(userRoutes); 




// Listen on port number 3000 , 
app.listen(3000, function (err) { 
    if (err) { 
    throw err; 
    } 
    console.log("Server is Running on port 3000"); 
}); 
+0

您使用的是'快车flash'节点模块?或者其他一些闪存库? – Mike

+0

我正在使用express-flash节点模块。 – Doobie2012

+0

'req.flash('errors')'包含您认为应该在GET /注册端点中的内容吗?你能否在'res.render('accounts/signup')'之前req.flash('errors')'? – Mike

回答

0

误差从该品系的茎:

user.email = req.body.email; 

这是因为req.body.emailundefined这意味着该电子邮件不是唯一的。您应该验证对/signup的请求是否与来自客户端的数据一起发送。

+0

我已经在邮递员中检查过并且正在发送数据,问题只是在显示错误时发生。所以我认为这行代码是好的,因为当我提交它将数据发布到mongodb时,唯一的问题是显示我自己的错误。不是mongodb错误 – Doobie2012

0

我刚检查 exisitinguser!== NULL

if (existingUser !== null)