2016-01-30 3 views
1

У меня действительно простой бэкэнд с несколькими маршрутами. Я хочу, чтобы сохранить логику маршрута вне файла server.js, но по какой-то причине, когда я делаю запрос POST на маршрут дает мне 404.app.use не работает экспресс 4

server.js

// Call packages 
var express = require('express'); 
var bodyParser = require('body-parser'); 
var app  = express(); 
var morgan = require('morgan'); 
var config = require('./config.js'); 
var mongoose = require('mongoose'); 
var path  = require('path'); 
var mandrill = require('mandrill-api/mandrill'); 
var mandrill_client = new mandrill.Mandrill(config.mandrillApi); 
var favicon = require('serve-favicon'); 

// Set up morgan to log HTTP requests 
app.use(morgan('dev')); 

// Set up mongo database 
mongoose.connect(config.database); 

// Parse body 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 

// Server favicon 
app.use(favicon(path.resolve('../client/content/images/logos/website-brand.png'))); 

//Routes 
app.use('/sendMail', require(__dirname + '/routes/sendMail.js')); 

// Default Routes 
app.get('/', function (req, res) { 
    res.sendfile(path.resolve('../client/views/index.html')); 
}); 
app.get('/:name', function (req, res) { 
    res.sendfile(path.resolve('../client/views/index.html')); 
}); 


//Serve static files 
app.use(express.static(path.resolve('../client'))); 
app.use('/scripts', express.static(path.resolve('../node_modules/angular-ui-bootstrap'))); 
app.use('/scripts', express.static(path.resolve('../node_modules/requirejs'))); 

//Log requests 
app.use(function (req, res, next) { 
    console.log(req.method, req.url); 
    next(); 
}); 

//Start server 
app.listen(config.port, function() { 
    console.log('I\'m listening on port ' + config.port); 
}); 

И sendMail.js

var config = require('../config.js'); 
var express = require('express'); 
var router = express.Router(); 
var mandrill = require('mandrill-api/mandrill'); 
var mandrill_client = new mandrill.Mandrill(config.mandrillApi); 

// Routes 
router.post(sendMail); 

module.exports = router; 

function sendMail(req, res, next) { 
    console.log("Receiving in sendMail"); 

    var name = req.body.name; 
    var email = req.body.email; 
    var message = req.body.message; 
    var toSend = { 
    "html": "<p>"+message+"</p>", 
    "text": message, 
    "subject": "From Website", 
    "from_email": email, 
    "from_name": name, 
    "to": [{ 
     "email": "", 
     "name": "", 
     "type": "to" 
    }] 
    }; 
    mandrill_client.messages.send({"message": toSend}, function(result) { 
    console.log(result); 
    var status = result[0].status; 
    if (status == 'sent') { 
     res.send({success: true}); 
    } else { 
     res.send({success: false, reason: status}); 
    }; 
    }, function(e) { 
    console.log("Mandrill Error: "+e.message); 
    res.send({success: false, error: e}); 
    }); 
    next(); 
}; 

Но когда я делаю запрос POST к/Sendmail это дает мне 404

enter image description here

+1

Как я могу сказать из экспресс-документа, 'router.post()' требует пути как первого аргумента, а не функции. – jfriend00

ответ

1

В sendMail.js удалить в конце файла:

next(); 

, потому что в этом маршруте ваших ответов находятся в асинхронном обратном вызове, и, прежде чем они Invoke, Node.js получить next() и поэтому перейти к следующему маршрутизатору. Поскольку нет более точных маршрутов, он возвращает 404.

Один оффтоп в server.js: Перенесите свой запрос журнала перед маршрутизатором sendMail.

+0

Ни одна из этих вещей не работала. Я попытался удалить следующий (сохранение в качестве параметра) и попытался удалить параметр и переместил маршрут ниже регистратора запросов. Все еще получаю 404 –

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