【问题标题】:Express routes returning 404s返回 404 的快速路线
【发布时间】:2017-01-31 19:06:17
【问题描述】:

我有几条简单的路线配置错误,不知道为什么。

app.js:

//app setup
var http = require('http');
var bodyParser = require('body-parser');
var express = require('express');
var routes = require('./routes');
var agent = require('./routes/agent');
var config = require('./config');
var app = express();


app.server = http.createServer(app);

app.use(bodyParser.json({
    limit : config.bodyLimit
}));

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

app.use('/v1', routes);
app.use('/v1/agent', agent);

app.server.listen(config.port);

console.log('API listening on port ' + app.server.address().port);

module.exports = app;

这会返回/v1/ 路由 (index.js) 上的响应:

'use strict';

var express = require('express');
var router = express.Router();

router.get('/', function (req, res) {
    res.status(403).json({
        message: 'Invalid request.'
    });
});

module.exports = router;

在代理路由中,我有一个在/v1/agent/login 正确处理的POST 处理程序。但是,当路由到 /v1/agent/ 的 GET 有效时,路由到 /v1/agent/123 的 GET 返回 404:

'use strict';
var agentController = require('../controller/agent.js');
var express = require('express');
var router = express.Router();

function handleError(objError, res) {
    res.status(500).json({ errorMessage : objError.message });
}

router.get('/', function (req, res) {
    res.status(200).json({
        message: 'OK' // works fine
    });
});

router.get('/:id'), function (req, res) {
    var agentNum = req.params.id;
    res.send(req.params); // 404 here

    try {
        //res.status(200).json({ message: 'hello agent.'});
    } catch (err) {
       // handleError(err, res);
    }
};


router.post('/login', function (req, res) {
    var agentNum, password;
    // works fine 
});

router.post('/pwr', function (req, res) {
    //also works fine
});
module.exports = router;

我的理解是app.use 方法应该将路由和附加到该路由的任何 GET 请求重定向到我指定的那个(代理),那么为什么带有参数的那个失败而根的那个成功呢?

谢谢

【问题讨论】:

  • 不确定这是否只是没有包含在您的 sn-p 中,但我在您的 routes/agent 文件中没有看到 module.exports=router
  • @LostJon 抱歉 - 是的,它存在(只是我的 sn-p 的疏忽)
  • 更改路由顺序,将app.use('/v1/agent', agent);放在app.use('/v1', routes);之前像这样:app.use('/v1/agent', agent); app.use('/v1', routes);
  • @RandomUser 我之前试了一下,没用。如果我创建一个带有附加 ID 的新路由/v1/agent/:id,它会起作用,但是当我继续将它路由到agent 时,它会返回/ 的默认路由,而不是我为它写的应该处理的路由请求参数。
  • 大声笑,检查答案。

标签: javascript node.js rest express


【解决方案1】:

您没有正确传递回调。

router.get('/:id')

router.get('/:id', function(req, res) {
    var agentNum = req.params.id;
    res.send(req.params); // 404 here

    try {
        //res.status(200).json({ message: 'hello agent.'});
    } catch (err) {
       // handleError(err, res);
    }
});

【讨论】:

  • 天哪。我对此唯一的安慰是知道另外两个人一开始也错过了它。
  • 确实如此。好吧,我们三个今天/今晚学到了一些新东西。
最近更新 更多