繁体   English   中英

Express Router 不显示端点请求

[英]Express Router not showing endpoint requests

我是新手,我正在尝试使用 express.Router() 来路由到不同的端点。 当我在线学习教程时,我只能从根“/”获取要发送的文本,而没有其他端点。 据我所知,我的代码与本教程非常匹配,所以我没有看到缺少的地方。

express.js

"use strict";
const express = require('express');
const app = express();

const resources = require('../routes/resources');
const commonExpress = require('common/lib/express');

commonExpress.setup_pre(app);
app.use('/', (req, res) => {
    res.send('<h1>Hey Socket.io</h1>');
});

app.use('/resources', resources)
//use /routes/resources to handle endpoints
//that start with '/resources'

commonExpress.setup_post(app);

module.exports = app;

资源.js

"use strict";
const express = require('express');
const router = express.Router();

router.use(function(req, res, next) {
    console.log(req.url, "@", Date.now());
    next();
});

router.route('/messages').get((req, res) => {
    res.send("hi get /resources/messages")
}).post((req, res) => {
    res.send("hi post /resources/messages");
});
router.route('/messages/:userId').get((req, res) => {
    res.send("hi get /resources/messages " + req.params.userId);
}).put((req, res) => {
    res.send("hi put /resources/messages " + req.params.userId);
})

module.exports = router;

普通快递

const express = require('express');
const logger = require('morgan');
const utils = require('./utils');
const cookieParser = require('cookie-parser');

module.exports = {
    setup_pre: app => {
        app.use(logger('dev'));
        app.use(express.json());
        app.use(cookieParser());
        app.use('/health', (req, res) => res.status(200).send());
    },
    setup_post: app => {
        app.disable('x-powered-by');
        app.use(utils.handleMezError);
        app.use(utils.handleMongoError);
        app.use(utils.handleUnknownError);
        app.use(function (req, res, next) {
            res.status(404).send();
        })
    }
};

这些是我使用 curl 命令时得到的响应:

tk@tk-desktop:~/messenger$ curl http://localhost:4000/
<h1>Hey Socket.io</h1>tk@tk-desktop:~/messenger$ curl http://localhost:4000/resources
<h1>Hey Socket.io</h1>tk@tk-desktop:~/messenger$ curl http://localhost:4000/resources/messages
<h1>Hey Socket.io</h1>tk@tk-desktop:~/messenger$ curl http://localhost:4000/resources/messages/:userId

你的代码在这里:

app.use('/', (req, res) => {
    res.send('<h1>Hey Socket.io</h1>');
});

抓取所有可能的 URL 并发送响应,并且不允许任何其他请求处理程序查看入站请求。 由于 Express 中的请求处理程序按照您注册它们的顺序进行处理,因此唯一可以在此处理程序获取入站请求之前运行的请求处理程序是commonExpress.setup_pre(app); .

可能,您想将上述路线更改为:

app.get('/', (req, res) => {
    res.send('<h1>Hey Socket.io</h1>');
});

因此,它只响应一个 GET 请求,因此它只匹配确切的/ URL(请参阅下面的详细信息)。

它可以帮助你理解一些事情:

  1. app.use()是贪婪的。 它将匹配以您使用的路径开头的任何入站 URL。 因此,如果您有app.use('/', ...) ,它将匹配所有可能的 URL,因为所有 URL 都以/开头。 因此, app.use()通常用于中间件,它准备一个请求/响应,但实际上并没有发送一个,然后调用next()继续路由到后续处理程序,并且不调用res.send()或任何其他发送响应的方法。 一旦您发送了响应并且未调用next() ,则该请求的所有路由都已完成。

  2. Express 按照请求处理程序注册的顺序处理入站请求。 因此,如果您有重叠的处理程序,您通常会将更宽松的处理程序放在后面,将更具体的处理程序放在前面。 如果你反其道而行之,那么更宽容的处理者会抓住一切,而其他人将永远不会射门。

  3. 看起来您可以将您的app.use('/', ...)更改为app.get('/', ...) ,它只会匹配确切的/ URL 而没有其他内容,或者您可以更改它成为不发送响应并调用next()继续路由的中间件处理程序。

  4. 看起来您可能会在app.get()更合适的其他地方使用app.use() 例如使用app.use('/health', ...)app.use()将匹配所有 HTTP 动词(GET、POST、PUT、DELETE、PATCH 等),但如果您发送的是在您的路由处理程序中响应,您通常希望只匹配其中一个动词。 如果它是浏览器请求内容的请求/响应类型的路由,那将是 GET 并且应该使用app.get() ,而不是app.use()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM