【问题标题】:expressjs not passing req.params through middlewareexpressjs 没有通过中间件传递 req.params
【发布时间】:2012-11-15 20:24:30
【问题描述】:

类似于this

我有以下路线:
app.get('/blogpost/:link', middleware.loginCheck, blog.postBlogs);

使用req.params.link 返回链接参数。
当我在middleware.loginCheck 中询问req.params.link 时,我收到了undefined

似乎req.params.link 没有被传递到中间件,因为我可以像这样访问它:
app.get('/blogpost/:link', function(req, res){console.log(req.params.link)});

我的中间件有什么问题?

最终版
a(href='/post/#{post.link}') #{comments} 呈现/post/myPostLink

{#post.link} 仅渲染变量替换,不会添加额外的/
a(href='/post#{post.link}') #{comments} renders '/postmyPostLink'

a(href='/post/' + post.link) #{comments} 渲染 /post/myPostLink

所以#{post.link}post.link 的工作方式相同,req.params.link 对这两个调用都有效。

UPDATE_2
我正在使用jade 来呈现网页。在里面我有一个这样写的锚标签:a(href='/post/#{post.link}) #{comments}
achor 标签工作正常并将我引导到正确的页面。但是express 不喜欢这种表示。相反,如果我将锚标记更改为 a(href='/post/' + post.link) #{comments} req.params.link 工作正常。

UPDATE_1
req.param('link') 适用于这种情况。
中间件没有问题。
但是为什么req.params.link 不起作用呢?

【问题讨论】:

  • 你能贴出你的中间件的相关代码吗?我在您发布的代码 sn-ps 中没有看到任何明显的错误。可能就像req.params.link 中的middleware.loginCheck 中的拼写错误一样简单。此外,您是否在请求中的多个位置传递了一个名为“链接”的参数,例如查询字符串或请求正文?如果是这样,则可以在req.params('link') 中取回数据,但在req.params.link 中取回数据是可能的,因为req.params 只是URL/路由参数,而req.param('link') 检查URL 参数,然后是正文,然后是查询字符串。
  • middleware.loginCheck 中没有提到req.params.link。我唯一一次打电话给req.params.link 是在blog.postBlogs。我只需要req.params.link 一直通过。我不认为我正在传递一个名为“链接”的参数。有一个<a href="/post/name_of_post">,其中name_of_postreq.params.link。因此,当用户单击该锚标记时,它会显示在 URL 中,那么 req.params.link 应该会弹出吗?

标签: express middleware


【解决方案1】:

好的,我们在 cmets 中来回切换了一下,但现在我的猜测是问题出在 URL 中的双斜杠

a(href='/post/#{post.link}') #{comments}

那是 A) 缺少结束引号,但我认为这只是您的问题中的错字,而不是您的代码中的错字。 B) 真正的问题是 post.link 包含一个前导斜杠,所以你最终会得到这个 HTML:

<a href='/post//post_link_name'>42</a>

因此 express 将其解析为空的 :link 参数。把你的玉改成这样:

a(href='/post#{post.link}') #{comments}

你应该重新开始工作了。

【讨论】:

  • #{post.link}#{comments} 在 html 中正确呈现。也就是说,a(href='/post/#{post.link}') #{cmets} 渲染/post/post_link_name#{comments} 显示一个数字。我需要更改它,因为您有 a(href='/post' + post.link) 以便快递将其附加到 req.params.linksee this
【解决方案2】:

express 的最新版本中,您可以使用 router.param() 作为中间件来专门处理 req.params

var router = express.Router();

router.param( "nickname", function (req, res, next, nickname) {

    console.log( "nickname: ", nickname );
    next();
});

router.get( "/user/:nickname", myController.method );

【讨论】:

    【解决方案3】:

    middleware.loginCheck 的签名是什么样的?它需要返回一个function(req, res, next)

    【讨论】:

    • 确实如此。我不发布中间件的原因是因为它真的很乱。但它确实function(req, res, next)
    • 应该适用于您所展示的内容。只是另一个,它只会在你的 /blogpost/:link 路由中定义
    猜你喜欢
    • 1970-01-01
    • 2018-12-12
    • 2021-03-16
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多