【问题标题】:Routing conceptual understanding路由概念理解
【发布时间】:2017-02-26 14:10:01
【问题描述】:

我正在创建一个 Node.js api,但我在理解路由器中间件时遇到了一些困难。 这是我点击 api 时运行的中间件。

app.use("/", index);
app.use("/menu", menu);

index-->index.js; 菜单-->menu.js
现在,index.js 有一个注册和登录路由器,两者都使用 POST。 menu.js 中没有此功能

index.js

router.post("/signup", function(req,res){
router.post("/signin", function(req,res){

问题如下:

  • 当我的 URI 位于 /menu 时,调用中间件 #2 后会呈现正确的页面
  • 当我点击注册/登录按钮时,它会在 /signin/signup 发送 AJAX 发布请求,无论是哪种情况。
  • 据我了解,第 2 点不应该起作用,因为 ajax 发布请求将转到 /menu/signup,其中有 NO 处理程序。
    然而,在 index.js 中为 POST 请求指定的处理程序会执行,并且即使在调用 /menu 中间件后,用户在菜单页面(URL:/menu)上也能够登录/注册
    我很难理解为什么会这样。
    任何帮助都会很棒,谢谢。
  • 【问题讨论】:

    • 这是什么意思:“然而,为 index.js 中的 POST 请求指定的处理程序正在执行”。另外,您能说明一下您的路由器是如何连接的吗?
    • 一旦路由器连接到 Express 中,它对来自所有页面的所有请求都是活动的。您似乎在想,当用户在/ 页面上时,不知何故只有某些路由处于活动状态。这不是 Express 的工作方式。路由在您的服务器启动时安装,并且对于所有请求始终处于活动状态。您通常会使用来自不同页面的不同 URL 来控制执行哪个路由。您不能使用来自 /page1 的请求 /xxx 和来自 /page2 的请求 /xxx 并期望它们命中不同的路由处理程序。
    • @jfriend00 好的......所以所有定义的路线都保持活动状态。但是,如果我已经为我的 API 定义了为所有 /menu GET 请求执行 menu.js,我假设在 /menu 在 URL 上处于活动状态之前,它应该只执行 menu.js
    • @jfriend00 除了概念之外:所以如果从 localhost:port/menu 向 /signin 发出 AJAX 请求,它是向 localhost/signin 还是 localhost/menu/signin 发出请求?
    • 如果前导 / 在请求中,那么它是域相关的,而不是页面相关的,因此对 /signin 的 Ajax 请求将转到 http://localhost/signin。如果 Ajax 请求只是针对signin,那么它是相对于页面的,因此如果页面是http://locahost/menu,那么 Ajax 请求将转到http://localhost/menu/signin。这一切都是在发出ajax请求之前由浏览器决定的。您几乎总是希望在请求中使用前导 /,因此它们始终是域相关的。

    标签: node.js routing middleware


    【解决方案1】:

    因为我认为它解决了您的问题,所以我会将其作为答案发布。

    如果您从没有前导 / 的网页(例如 signup)进行 Ajax 调用,则浏览器会将其解释为相对于页面,这意味着如果页面 URL 是 http://localhost/menu 并且您请求ajax 调用signup,然后浏览器会请求http://localhost/menu/signup 的url。

    但是,如果您在 ajax 请求前加上 / 并请求 /signup,那么这是域相关的,因此浏览器将添加域并请求 http://locahost/signup。不会使用当前页面的路径。您几乎总是希望使用前导 /,因为无论您在哪个页面上,这都会为您提供一致的 URL 请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多