简体   繁体   中英

NodeJS server crash after save data to mongoDB

I wrote a script which save an object to a MongoDB database using mongoose. The object is correctly save to the database, but the server crashes right after, throwing me the following error message: catch(err) { process.nextTick(function() { throw err}); } catch(err) { process.nextTick(function() { throw err}); }

Here's a part of my code:

users.js

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

router.post('/register', function(req, res, next) {

[...]

// checks for errors
var errors = req.validationErrors();
if (errors) {
    res.render('register', {
        errors: errors,
        [...]
    })
} else {
    var newUser = new User({
      [...]
    });

    // Create user
    User.createUser(newUser, function(err, user) {
        if (error) {
          throw err;
        };

        console.log(user);
    });

    [...]
}
});

module.exports = router;

user.js

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/nodeauth');

// User Schema
var UserSchema = mongoose.Schema({
    [...]
});

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

module.exports.createUser = function(newUser, callback) {
    newUser.save(callback);
}

apps.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var passport = require('passport');
var localStrategy = require('passport-local').Strategy;
var bodyParser = require('body-parser');
var multer = require('multer');
var flash = require('connect-flash');
var mongo = require('mongodb');
var mongoose = require('mongoose');
var db = mongoose.connection;
var expressValidator = require('express-validator');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// handle file uploads
app.use(multer({dest:'./uploads'}).single('singleInputFileName'));

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// handle express session
app.use(session({
secret: 'secret',
saveUninitialized: true,
resave: true
}));

// passport
app.use(passport.initialize());
app.use(passport.session());

// validator
app.use(expressValidator({
  errorFormatter: function(param, msg, value) {
  var namespace = param.split('.')
  , root    = namespace.shift()
  , formParam = root;

while(namespace.length) {
  formParam += '[' + namespace.shift() + ']';
}
return {
  param : formParam,
  msg   : msg,
  value : value
};
  }
    }));
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));

// connect flash
app.use(flash());
app.use(function (req, res, next) {
  res.locals.messages = require('express-messages')(req, res);
  next();
});

app.use('/', routes);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});


module.exports = app;

You shouldn't throw error you should return it in handler to let clients know if there is a database error creating the user. Only throw when caller can catch error, async code cannot be caught easily. Promises enable throwing errors but not callbacks.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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