为什么表达中间件会覆盖我的api响应?

时间:2017-10-20 08:33:22

标签: node.js express

我是nodejs / express的新手,并且已经关注了博客文章"Build Node.js RESTful APIs in 10 Minutes"。它提供了创建简单REST api的详细步骤。完成文章中提到的每个代码后,应用程序都没有正常工作,它只会返回

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

我发现罪魁祸首是在文章的最后部分,它告诉我将这一行添加到server.js:

  

完成所有这些后,如果我们进入错误的路线会发生什么?说   您输入了“http://localhost:3000/task”,它会回复一条消息   “无法获得/任务”。让我们添加可以使用的快速中间件   返回更多互动信息。

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

无论我的api返回什么,似乎都会将HTTP状态代码硬编码为404。删除此行后,该应用程序将返回有意义的响应。

这是我的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);

控制器:

'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);
    });
};

2 个答案:

答案 0 :(得分:1)

它没有覆盖您的回复,只是因为它在触摸您的api之前在中间返回。请求流程从上到下运行,例如上面的代码:

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

只有use() 404中间件到底部,一切正常。

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 :(得分:1)

我怀疑你的

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

应该更低:服务器首先找到那段代码,而实际的路由稍后加载。

app.use表示它始终执行该代码,因此它通过发送404错误并说它无法找到该URL来处理每个请求。

将该代码放在所有其他路由下(位于app.listen(port)上方),它应该可以正常工作!