2015-04-29 2 views
1

Я неопытный в backend и работаю с узлом и пытаюсь настроить запрос POST $ http для отправки формы Express. Каждый раз, когда я делаю запрос, мой обратный вызов data - null. Возможно, мои экспресс-маршруты настроены неправильно? Я использую Angular для связи с Express/Node для отправки электронной почты через nodemailer (который я уже правильно настроил).

Вот мой запрос $http POST:

клиент/сервис/Emailer/emailer.js

angular.module('public').factory('EmailerService',function($http) { 
    return { 
      postEmail: function(emailData, callback) { 
      console.log('call http with object', emailData); 
      $http({ 
       method: 'POST', 
       url: 'http://my-website.com/server/routes/emailer', 
       data: emailData, 
       headers: { "Content-Type": "application/json" }, 
       responseType: 'json' 
      }).success(function(data, status, headers, config) { 
       console.log('success', data, status); 
      }).error(function(data, status, headers, config) { 
       console.log('error', data, status); 
      }).catch(function(error){ 
       console.log('catch', error); 
      }); 
     } 
    }; 
}); 

Вот моя сторона сервера Экспресса конфигурация:

сервера/маршруты/emailer.js

var express = require('express'); 
var router = express.Router(); 
var bodyParser = require('body-parser'); 
var logger = require('morgan'); 

var app = express(); 

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(logger('dev')); 

app.post('/emailer', function(req,res) { 
    // NOTHING LOGS HERE 
    console.log(res, req, req.body, res.body); 
}); 

module.exports = app; 

Ничто не входит в консоль здесь, и обработку на $http запроса об ошибке возвращает это:

emailer.js:4 call http with Object {email: "asdf"} 
angular.js:8632 OPTIONS http://matt-mcdaniel.com/server/routes/emailer net::ERR_CONNECTION_TIMED_OUT(anonymous function) @ angular.js:8632sendReq @ angular.js:8426$get.serverRequest @ angular.js:8146deferred.promise.then.wrappedCallback @ angular.js:11682deferred.promise.then.wrappedCallback @ angular.js:11682(anonymous function) @ angular.js:11768$get.Scope.$eval @ angular.js:12811$get.Scope.$digest @ angular.js:12623$get.Scope.$apply @ angular.js:12915(anonymous function) @ angular.js:19264jQuery.event.dispatch @ jquery.js:4676jQuery.event.add.elemData.handle @ jquery.js:4360 
emailer.js:14 error null 0 
emailer.js:16 catch Object {data: null, status: 0, headers: function, config: Object, statusText: ""} 

Для хорошей мерой, и так как я новичок в обучении Express, я выложу на моей стороне сервера app.js ,

сервер/app.js

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var compression = require('compression'); 
var routes = require('./routes/index'); 
var contact = require('./routes/emailer'); 

var app = express(); 

// uncomment after placing your favicon in /public 
//app.use(favicon(__dirname + '/public/favicon.ico')); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(compression()); 
app.use(require('connect-livereload')({ 
    port: 35729, 
    ignore: ['.js'] 
})); 

/** Development Settings */ 
if (app.get('env') === 'development') { 
    // This will change in production since we'll be using the dist folder 
    app.use(express.static(path.join(__dirname, '../client'))); 
    // This covers serving up the index page 
    // app.use(express.static(path.join(__dirname, '../client/.tmp'))); 
    // app.use(express.static(path.join(__dirname, '../client/public'))); 

    // Error Handling 
    app.use(function(err, req, res, next) { 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: err 
     }); 
    }); 
} 

/** 
* Production Settings 
*/ 
if (app.get('env') === 'production') { 

    // changes it to use the optimized version for production 
    app.use(express.static(path.join(__dirname, '/dist'))); 

    // 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; 

app.use(function(req, res) { 
    res.sendfile(__dirname + '/dist/index.html'); 
}); 

Вот мой файл Структура:

enter image description here

+0

Не могли бы вы добавить соответствующую часть вашего _client/app.js_, который вызывает метод ПОСТ через вашу фабрику EmailService? –

+0

Я не знал, что мне нужно было добавить что-либо в app.js, кроме «var contact = require (« ./ routes/emailer »)». Я думаю, я не уверен, как вызывать запрос POST на задний конец ... – Himmel

ответ

2

Вы определенно есть некоторые проблемы в вашем emailer.js маршруте. У вас должна быть только логика маршрутизации, вы не должны воссоздавать свое экспресс-приложение. Экспресс дает вам Router объект, чтобы сделать это легко. Например, ваш emailer.js может выглядеть следующим образом:

module.exports = express.Router() 
    .post('/emailer', function(req,res) { 
     console.log(res, req, req.body, res.body); 
     res.json({hello:'world'}); 
    }); 

И вы можете отобразить этот маршрут в server/app.js так:

var emailer = require('./routes/emailer'); 

// ...After all app.use statements, but *before* your error handlers 
app.use('/server/routes', emailer); 
+0

данные все еще возвращен 'null'. Как я должен указывать на этот маршрут с помощью моего вызова $ http из моей службы, должен ли я помещать весь адрес, как показано выше? – Himmel

+0

О, ваш тип ответа - JSON, и мой код просто возвращает строку. Это может быть проблемой. Я уточню свой ответ. Кроме того, вы должны иметь возможность использовать относительный путь из вашего углового кода, например, 'url: '/ server/routes/emailer'' –

+1

Это исправлено! Спасибо. – Himmel

Смежные вопросы