2017-10-20 12 views
0

Je suis nouveau à nodejs/express et j'ai suivi un article de blog "Build Node.js RESTful APIs in 10 Minutes". Il a fourni des étapes détaillées pour créer des API simples REST. Après avoir terminé chaque code mentionné dans l'article, l'application n'a pas fonctionné correctement, il suffit de retournerPourquoi le middleware express remplace-t-il la réponse de mon API?

{ 
    "url": "/transactions not found" 
} 

J'ai trouvé que le coupable était dans la dernière partie de l'article, qui m'a dit d'ajouter cette ligne à server.js:

Après avoir fait tout cela, que se passe-t-il si nous sommes entrés dans une mauvaise route? dire vous avez entré 'http://localhost:3000/task', Il répond par un message "Impossible de GET/tâche". Ajoutons un middleware explicite qui pourrait être utilisé pour renvoyer plus de messages interactifs.

app.use(function(req, res) { 
    res.status(404).send({url: req.originalUrl + ' not found'}) 
}); 

Il semble coder un code d'état HTTP 404, peu importe ce que fait mes déclarations api. Après avoir supprimé cette ligne, l'application renvoie une réponse significative.

Voici mon server.js:

var express = require('express'), 
    app = express(), 
    port = process.env.PORT || 3000, 
    mongoose = require('mongoose'), 
    Transaction = require('./api/models/transactionModel'), //created model loading here 
    bodyParser = require('body-parser'); 


// mongoose instance connection url connection 
mongoose.Promise = global.Promise; 
mongoose.connect('mongodb://localhost/transactionDb'); 

app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 

app.use(function(req, res) { 
    res.status(404).send({url: req.originalUrl + ' not found'}) 
    }); 

var routes = require('./api/routes/transactionRoutes'); //importing route 
routes(app); //register the route 

app.listen(port); 

console.log('Transaction List RESTful API server started on: ' + port); 

Et le contrôleur:

'use strict'; 

var mongoose = require('mongoose'), 
    Transaction = mongoose.model('Transactions'); 

exports.list_all_transactions = function (req, res) { 
    Transaction.find({}, function (err, transaction) { 
     if (err) 
      res.send(err); 
     res.json(transaction); 
    }); 
}; 

exports.create_a_transaction = function (req, res) { 
    var new_transaction = new Transaction(req.body); 
    new_transaction.save(function (err, transaction) { 
     if (err) 
      res.send('Error creating a new transaction!'); 
     res.json(transaction); 
    }); 
}; 

Répondre

1

il n'a pas été remplacer votre réponse, juste parce qu'il est revenu au milieu avant toucher votre api. Le flux de demande est en cours d'exécution de haut en bas, par exemple dans votre code ci-dessus:

[coming request] --> bodyParser --> bodyParser --> 404 handler (returned here) -x-> api (cannot reach). 

Juste use() 404 middleware au fond et tout fonctionne bien.

mongoose.Promise = global.Promise; 
mongoose.connect('mongodb://localhost/transactionDb'); 

app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 
var routes = require('./api/routes/transactionRoutes'); //importing route 
routes(app); //register the route 

app.use(function(req, res) { 
    res.status(404).send({url: req.originalUrl + ' not found'}) 
}); 
1

Je soupçonnez que votre

app.use(function(req, res) { 
    res.status(404).send({url: req.originalUrl + ' not found'}) 
}); 

devrait être plus faible: le serveur est de trouver ce morceau de code en premier lieu, alors que les routes réelles sont chargés plus tard. App.use signifie qu'il exécute toujours ce code, de sorte qu'il traite chaque requête en envoyant une erreur 404 et en disant qu'il ne peut pas trouver l'adresse URL.

Mettez ce code sous tous les autres itinéraires (juste au-dessus app.listen (port)) et cela devrait fonctionner!