2016-09-21 2 views
0

, поэтому у меня есть сервер узлов и работает с конечной точкой api, которая продолжает сбой, когда дубликат электронной почты вводится через почтальон. Если происходит не дублирование регистрации, сервер продолжает работать без икоты. Но если дубликат электронной почты представляется, я вижу повторяющиеся ошибки по электронной почте на почтальона:Сбой при сбое узла, когда происходит повторная регистрация

{ 
    "code": 11000, 
    "index": 0, 
    "errmsg": "E11000 duplicate key error collection: register.users index: email_1 dup key: { : \"[email protected]\" }", 
    "op": { 
    "userRole": "isUser", 
    "password": "yudfjadjslkafdaljj343", 
    "zip": "94596", 
    "state": "CA", 
    "city": "Walnut Creek", 
    "address2": "", 
    "streetAddress": "1 fake address ", 
    "phoneNumber": "(925) 555-0644", 
    "email": "[email protected]", 
    "lastName": "Last", 
    "firstName": "Person", 
    "_id": "57e2b2e49f0de63201914616", 
    "__v": 0 
    } 
} 

Вот апи маршрут:

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

module.exports = function (app) { 

    router.route('/users') 

    .get(function (req, res) { 
    res.json({ message: 'welcome!!' }); 
    }) 

    .post(function (req, res) { 
    var rb = req.body; 
    var user = new User(); 
    user.firstName = rb.firstName; 
    user.lastName = rb.lastName; 
    user.email = rb.email; 
    user.phoneNumber = rb.phoneNumber; 
    user.streetAddress = rb.streetAddress; 
    user.address2 = rb.address2; 
    user.city = rb.city; 
    user.state = rb.state; 
    user.zip = rb.zip 
    user.password = rb.password; 
    user.userRole = rb.userRole; 


    user.save(function(err) { 
     if (err) { 
     res.send(err); 
     next(); 
     }; 
     res.json({ message: 'UserCreated!' }); 
    }); 
    }); 

    app.use('/api', router); 

} 

и схема мангуста:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var UserSchema = new Schema({ 
    firstName: { 
    type: String, 
    required: true 
    }, 
    lastName: { 
    type: String, 
    required: true 
    }, 
    email: { 
    type: String, 
    required: true, 
    index: true, 
    unique: true 
    }, 
    phoneNumber: { 
    type: String, 
    required: true 
    }, 
    streetAddress: { 
    type: String, 
    required: true 
    }, 
    address2: String, 
    city: { 
    type: String, 
    required: true 
    }, 
    state: { 
    type: String, 
    required: true 
    }, 
    zip: { 
    type: String, 
    required: true 
    }, 
    password: { 
    type: String, 
    required: true 
    }, 
    userRole: { 
    type: String, 
    required: true 
    } 
}); 

module.exports = mongoose.model('User', UserSchema); 

Наконец ошибка на терминале:

[nodemon] restarting due to changes... 
[nodemon] starting `node server/server.js` 
Up and running on port 3000 
events.js:160 
     throw er; // Unhandled 'error' event 
    ^

Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:346:11) 
    at ServerResponse.header (/Users/atlanteavila/Documents/myapps/register/node_modules/express/lib/response.js:719:10) 
    at ServerResponse.send (/Users/atlanteavila/Documents/myapps/register/node_modules/express/lib/response.js:164:12) 
    at ServerResponse.json (/Users/atlanteavila/Documents/myapps/register/node_modules/express/lib/response.js:250:15) 
    at /Users/atlanteavila/Documents/myapps/register/server/routes/signUp.js:34:11 
    at /Users/atlanteavila/Documents/myapps/register/node_modules/mongoose/lib/model.js:3336:16 
    at /Users/atlanteavila/Documents/myapps/register/node_modules/mongoose/lib/document.js:1932:15 
    at _combinedTickCallback (internal/process/next_tick.js:67:7) 
    at process._tickCallback (internal/process/next_tick.js:98:9) 
[nodemon] app crashed - waiting for file changes before starting... 

Заранее благодарим за помощь в выяснении этого. Благодаря!

ответ

1

Вы отправляете two ответов, поэтому вы получаете эту ошибку

Я не думаю, что вам нужно использовать next() обратный вызов, если вы отправляете ответ в save function, который будет fail or success.

Попытка вернуть ответ после манипуляции, как этот

user.save(function(err) { 
     if (err) { 
     return res.send(err); 
     }; 
     return res.json({ message: 'UserCreated!' }); 
    }); 
+0

Это определенно решило проблему. Я выбрал это как лучший ответ b/c, в обоих случаях требуется возвращение. Благодаря! –

0

У вас есть уникальный: true в вашей схеме и при попытке вставить дубликат записи. Это нарушает правило проверки схемы. Вы должны использовать обработку исключений для своих запросов и проанализировать эти ошибки. Вы можете использовать блок try-catch, и если вы используете обещание, используйте блок catch с каждым запросом.

Чтобы отправить ответ о дублирующихся записях. Добавьте следующее к вашему устройству для устранения ошибок маршрутизатора:

if (err instanceof Error && err.name === "MongoError" && err.driver) { 
     if (err.code == 11000) { // unique index conflict 
      return ['Resource document already exists.']; 
     } 
    } 

и вернуть его в ответ от отправителя ошибок.

2

Вы отправляете два ответа при возникновении ошибки (которая бросает исключение). Вы можете уменьшить это, вернув next() или вернувшись после его вызова.

user.save(function(err) { 
    if (err) { 
    return res.send(err); 
    } 
    res.json({ message: 'UserCreated!' }); 
}); 
+1

Вызов 'next' не очень полезно в этой ситуации (и, возможно, вредно, так как это может привести к дополнительным 404 ответ будет генерироваться), а ответ уже завершен вызовом 'res.send()'. – robertklep

+0

Хорошая точка, обновленная –