【问题标题】:req.query undefined in Nuxt Express Middleware get request在 Nuxt Express 中间件获取请求中未定义 req.query
【发布时间】:2018-07-04 00:41:14
【问题描述】:

不是服务器中间件之类的专业人士,但没有太多线索。

在一个 vue 组件中,我使用 axios 检索数据:

  axios
    .get('/api/getDailyFeedback', {
      params: {
        start: '2018-05-01'
      }
    })

这用于 Nuxt 中的 express(4.16.2 版)服务器中间件设置。我已经获得了正常的获取和发布请求,但问题是当我想将参数传递给获取请求时,如下所示:

router.get('/getDailyFeedback', (req, res) => {
   console.log('Query:', req.query.start);
   //do stuff
});

我对 Express 4 的小经验,我花了一点时间才意识到为什么在 post 请求的正文中传递的参数是未定义的,但这是因为我需要添加 body-parser.json()到我的 nuxt 配置,因为他们从主快递包中删除了它。同样,我认为我需要 bodyParse.urlencoded 但这没有用。这是我添加到我的 nuxt.config 的行:

serverMiddleware: [bodyParser.urlencoded({ extended: false }), bodyParser.json(), '~/api'],

我不确定内容类型是否设置不正确,或者我在这里遗漏了一些简单的东西。我知道我可以使用各种库从我可以访问的 url 字符串中获取参数,因为 Axios 正在按预期工作并将我的“params”对象添加到我的 get 请求的末尾。但是我看到的许多其他问题的解决方案是“哦,就像访问 req.query 一样简单”Alas Express 无法定义 req.query 对象,甚至是 req.params 或 req.body。

希望这是足够的细节,非常感谢您的阅读和任何建议。

【问题讨论】:

    标签: node.js express vue.js axios nuxt.js


    【解决方案1】:

    为了以后的任何人

    const { Router } = require('express')
    
    Router.get('/orders', async (req, res, next) => {
        const request = req.query.sometext;
        res.json({data: request});
    });
    
    module.exports = Router;
    <script>
        export default() {
            async mounted() {
                const orders = await axios.get(`/api/orders`, {
                    params: {
                        sometext: 'bla bla'
                    }
                });
           }
       }
    </script>

    http://expressjs.com/en/api.html#req

    【讨论】:

      【解决方案2】:

      我使用的是 Nuxt 2.15,我可以像这样访问查询参数req._parsedOriginalUrl.query

      【讨论】:

        【解决方案3】:

        您无需其他模块即可访问 Nuxt 获取参数。 只需使用:

        req.request.get()

        【讨论】:

          【解决方案4】:

          第一次尝试在 Nuxt 中使用 get 请求是一个令人不快的惊喜,不是吗? Nuxt 创建了一个连接实例,这会导致一些陷阱。它的 req 是 Node.js http 请求对象,所以 它没有 query propertyrequest.body 在 get 请求中也被跳过!

          但凡事都有办法。你的代码:

            axios.get('/api/getDailyFeedback', {
                params: {
                  start: '2018-05-01'
                }
              })
          

          转换为以下 URI 调用:

          /api/getDailyFeedback?start=2018-05-01

          因此,您已经在 URI 中获得了所有参数,您可以通过 url 解析从中检索它们。顺便说一下,模块url 随 Node.js 一起提供。

          const url = require("url");
          
          router.get('/getDailyFeedback', (req, res) => {
             let queryData = url.parse(req.url, true).query
             console.log('Query:', queryData.start)
          });
          

          我写了一个用自定义属性扩展 req 的小助手。代码如下:

          router.use((req, res, next) => {
            var theQuery = url.parse(req.url, true).query
            req.queryData = theQuery 
            next()
          })
          

          那么你可以这样使用它:

          router.get('/getDailyFeedback', (req, res) => {
             console.log('Query:', req.queryData.start)
          });
          

          通过 get 传递参数的其他方法是使用可选的 uri 段:

          router.get('/getDailyFeedback/:start?', (req, res) => {
             console.log('Query:', req.params.start)
          });
          

          【讨论】:

          • 非常感谢您对此的解决方案,我最终做了类似的事情来获得正确的参数。但是,很高兴知道我无法访问请求值的原因,感谢您抽出时间来回答这个问题,尽管问题已经存在。
          • 不客气@Thermetro - 我认为理解问题并与公众分享总是一件好事 - 它可以让我们大家有点头疼;)
          猜你喜欢
          • 2021-06-23
          • 2020-09-25
          • 2016-04-14
          • 2021-07-04
          • 1970-01-01
          • 2021-09-19
          • 1970-01-01
          • 2022-11-11
          • 2018-10-11
          相关资源
          最近更新 更多