我在代码中使用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)
我在几个地方使用相对网址。
在路由处理程序中,我可能会执行res.redirect(" foo")。所以,如果 传入的URL是example.com/myapp/tests/,这将导致重定向到URL example.com/myapp/tests/foo,但如果传入的URL是example.com/myapp/tests,这将导致重定向到示例。 COM / MYAPP / foo中。我希望第二个,而不是第一个。
在我生成的HTML页面中(使用EJS呈现)包含CSS和HTML表单,链接,按钮。因此,如果传入的URL有一个尾部斜杠
,这样的CSS包括错误地解析link href =" stylesheets / my.css" rel =" stylesheet">
这些东西的路径都是相对于当前页面的。但是,如果浏览器的位置框显示该页面为example.com/myapp/tests/ 我得到的网址与example.com/myapp/tests不同。在前一种情况下,CSS没有找到,因为它在/tests/stylessheets/my.css而不是/stylesheets/my.css中查找它。类似地,其他相对URL解析不同,因为可以使用两个不同的传入URL有效地生成此页面。
答案 0 :(得分:0)
尾部斜杠后面没有任何内容的URL与没有尾部斜杠的URL相同。例如,/tests/new
与/tests/new/
从您的代码中,tests.js
包含如果您的app
未使用它将无法执行任何操作的路线。
从您的代码中,您将其用于/tests
,这意味着对于/tests
,它将使用tests.js
中定义的路由。这意味着tests.js
文件中定义的每条路线都将在/tests
之后追加,因为:
app.use("/tests", tests);
如果您想单独使用/ new路线,可以执行以下操作。
/new
路由,然后执行app.use("/", newRoute);
答案 1 :(得分:0)
简短回答:您通过tests
使用此行路由所有内容:
.use("/tests", tests);
Use
定义了中间件,这意味着您的所有路由都通过它。