节点JS Express路由不处理/正确

时间:2016-10-25 13:01:23

标签: node.js express routing

我在代码中使用express Router。

第一个定义接受localhost:3000 / tests哪个是正确的。 第一个定义也接受localhost:3000 / tests /似乎不正确。

当这里接受第二个URL时,会导致生成具有错误相对URL的HTML(例如,当接受第二个URL时,变为/ tests / hello而不是所需的/ hello)。为什么会这样?我是否应该采取措施防止带有斜杠的URL匹配?如果必须同时接受这两者,如何生成在两种情况下都正确的相对URL?

//tests.js:

const router = express.Router();

// accepts /tests AND /tests/
router.get('/', function(req, res, next) {
 });

// accepts /tests/new AND /tests/new/
router.get('/new', function(req, res, next) {
 });

//app.js

var tests = require('./routes/tests');
app.use('/tests', tests);

我看到的所有node.js示例代码都使用" /"等路由。和" / foo"所以我不确定自己哪里出错了。

其他编辑:

创建相对URL时,它会构建传入的URL。因此,如果路由处理程序同时接受/ tests和/ tests /,那么构建的所有相对URL将解析为不同的路径,因为最后一个斜杠对具体路径的形成有很大影响。我应该补充一点,在我的部署环境中,这个应用程序由apache转发到使用代理,因此节点页面的完整URL有一个像example.com/myapp/tests这样的上下文。我的devleopment环境中的路径会有所不同(例如localhost:3000 / tests)

我在几个地方使用相对网址。

  1. 在路由处理程序中,我可能会执行res.redirect(" foo")。所以,如果 传入的URL是example.com/myapp/tests/,这将导致重定向到URL example.com/myapp/tests/foo,但如果传入的URL是example.com/myapp/tests,这将导致重定向到示例。 COM / MYAPP / foo中。我希望第二个,而不是第一个。

  2. 在我生成的HTML页面中(使用EJS呈现)包含CSS和HTML表单,链接,按钮。因此,如果传入的URL有一个尾部斜杠

    ,这样的CSS包括错误地解析

    link href =" stylesheets / my.css" rel =" stylesheet">

  3. 这些东西的路径都是相对于当前页面的。但是,如果浏览器的位置框显示该页面为example.com/myapp/tests/ 我得到的网址与example.com/myapp/tests不同。在前一种情况下,CSS没有找到,因为它在/tests/stylessheets/my.css而不是/stylesheets/my.css中查找它。类似地,其他相对URL解析不同,因为可以使用两个不同的传入URL有效地生成此页面。

2 个答案:

答案 0 :(得分:0)

尾部斜杠后面没有任何内容的URL与没有尾部斜杠的URL相同。例如,/tests/new/tests/new/

相同

从您的代码中,tests.js包含如果您的app未使用它将无法执行任何操作的路线。

从您的代码中,您将其用于/tests,这意味着对于/tests,它将使用tests.js中定义的路由。这意味着tests.js文件中定义的每条路线都将在/tests之后追加,因为:

app.use("/tests", tests);

如果您想单独使用/ new路线,可以执行以下操作。

  1. 在其他文件中定义/new路由,然后执行app.use("/", newRoute);
  2. 自己定义路线。 (虽然我不建议这样做,因为它会使你的代码混乱)

答案 1 :(得分:0)

简短回答:您通过tests使用此行路由所有内容:

.use("/tests", tests);

Use定义了中间件,这意味着您的所有路由都通过它。