сервер узла не возвращает никакого ответа после запроса API

Я создаю API с помощью Node.js, Express, MYSQL и с помощью sequenceize. Я использую шаблон MVC.

Однако проблема, с которой я сталкиваюсь, заключается в том, что сервер не может отправить ответ http после запроса. При отправке почтового запроса, например, с помощью почтальона, запрос продолжает загружаться и завершается примерно через 2 минуты с исключением НЕ МОЖЕТ ПОЛУЧИТЬ НИКАКОЙ ОТВЕТ. При этом данные корректно сохраняются в базе данных.

Это мой метод регистрации пользователя AuthController:

'use strict';
// AuthController.js
var express = require('express');
var router = express.Router();
var bodyParser = require('body-parser');
router.use(bodyParser.urlencoded({ extended: false }));
router.use(bodyParser.json());
var jwt = require('jsonwebtoken');
var bcrypt = require('bcryptjs');
const Model = require('../models/index');
const User = Model.sequelize.import('../models/user');


// Register new User.
exports.register = function(req, res) {
        var hashedPassword = bcrypt.hashSync(req.body.password, 8);

     User.create({
     name : req.body.name,
    email : req.body.email,
    password : hashedPassword
        }, 

function (err, user) {
    if (err) 
    {
      return res.status(500).send("There was a problem registering the user. "+err)
    }
    else{
      // create a token
    var token = jwt.sign({ id: user._id }, process.env.AUTH0_CLIENT_SECRET, {
      expiresIn: 86400 // expires in 24 hours
    });
    res.status(200).json({ auth: true, token: token }); 
    }



  }); 

};

// App.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
const cors = require('cors');
var app = express();
var indexRoutes = require('./routes/index');
var userRoutes = require('./routes/users');
var courseRoutes = require('./routes/courses');
var authRoutes = require('./routes/auth');

// view engine setup
// Currently I am not using view-templates
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(cors());
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

app.use(cookieParser());
app.use(cors()); //enable CORS
app.use(express.static(path.join(__dirname, 'public')));

//User Routes
app.use('/', indexRoutes);
app.use('/api', userRoutes);
app.use('/api', courseRoutes);
app.use('/api/auth', authRoutes);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

//МАРШРУТЫ

//auth.js

var express = require('express');
var router = express.Router();
//Require Controller Modules
var controller = require('../controllers/AuthController');

//Register new user

router.post('/register', controller.register);
router.get('/user', controller.me);

router.post('/login', controller.login);
router.get('/logout', controller.logout);


module.exports = router;

//Модель пользователя

'use strict';
module.exports = (sequelize, DataTypes) => {
  var User = sequelize.define('User', {
    //id: DataTypes.INTEGER,
    name: DataTypes.STRING,
    email: {type: DataTypes.STRING, allowNull: false, unique: true, validate: { isEmail: {msg: "Invalid Email"} }},
    password: DataTypes.STRING
  }, {});
  User.associate = function(models) {
    // associations can be defined here

  };
  return User;
};

Подключение к БД //в моделях/index.js

'use strict';

var fs        = require('fs');
var path      = require('path');
var Sequelize = require('sequelize');
var basename  = path.basename(__filename);
var env       = process.env.NODE_ENV || 'development';
var config = require(__dirname + '/../config/config.json')[env];
var db        = {};
const Op = Sequelize.Op;

if (config.use_env_variable) {
  var sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {

  var sequelize = new Sequelize(config.database,
   config.username,
    config.password, 

     { 
  host: config.host,
  dialect: config.dialect,
  operatorsAliases: false, 
    }
  );


  //check if connection is established
  sequelize
  .authenticate()
  .then(() => {
    console.log('Database Connection has been established successfully.');
  })
  .catch(err => {
    console.error('Unable to connect to the database:', err);
  });
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    var model = sequelize['import'](path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

Я думаю, что что-то не так, я совершаю или что-то упускаю. Я испытываю эту проблему при отправке POST REQUESTS. Данные сохраняются в таблице mysql, но ответ не отправляется.

Пожалуйста помогите. Спасибо.


person wafutech    schedule 14.08.2018    source источник
comment
Скажите, пожалуйста, доходит ли запрос до контроллера?   -  person Ajay    schedule 14.08.2018
comment
Да конечно. Это контроллер, который сохраняет данные в базу данных. Как я уже упоминал, данные сохраняются в базе данных, как и ожидалось.   -  person wafutech    schedule 14.08.2018
comment
не могли бы вы поделиться образцом запроса? например, тип запроса, полезная нагрузка и т. д.   -  person Bharat Bhushan    schedule 14.08.2018


Ответы (1)


Спасибо, ребята, за попытку помочь. После работы я обнаружил, что проблема связана с методом контроллера. Способ, которым он был структурирован, не отправлял ответ после того, как данные сохраняются в базе данных. Вот как я перекодировал свой метод регистрации в AuthController:

//Старый

// Register new User.
exports.register = function(req, res) {
        var hashedPassword = bcrypt.hashSync(req.body.password, 8);

     User.create({
     name : req.body.name,
    email : req.body.email,
    password : hashedPassword
        }, 

function (err, user) {
    if (err) 
    {
      return res.status(500).send("There was a problem registering the user. "+err)
    }
    else{
      // create a token
    var token = jwt.sign({ id: user._id }, process.env.AUTH0_CLIENT_SECRET, {
      expiresIn: 86400 // expires in 24 hours
    });
    res.status(200).json({ auth: true, token: token }); 
    }

//Переписать:

// Register new User.
exports.register = function(req, res) {
        var hashedPassword = bcrypt.hashSync(req.body.password, 8);

     User.create({
     name : req.body.name,
    email : req.body.email,
    password : hashedPassword
        })
        .then(user=>{
           // create a token
    var token = jwt.sign({ id: user._id }, config.secret, {
      expiresIn: 86400 // expires in 24 hours
    });
    return res.status(200).json({ auth: true, token: token });

        }).catch(err=>{


          return res.status(500).send("There was a problem registering the user. "+err)

        }); 



};

Это сработало для меня, и теперь код работает так, как ожидалось.

person wafutech    schedule 14.08.2018