在Nuxt Express Middleware获取请求中的req.query未定义

时间:2018-01-24 20:57:29

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

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

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

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

这是Nuxt中的express(版本4.16.2)服务器中间件设置。我已经获得了正常的get和post请求才能正常工作,但问题是当我想将参数传递给get请求时,如下所示:

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。

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

3 个答案:

答案 0 :(得分:1)

第一次尝试在Nuxt中使用get请求是一件令人不快的惊喜,不是吗? Nuxt创建了一个连接实例,导致一些陷阱。它的req是Node.js http请求对象,因此它没有query property,并且在获取请求中也会跳过request.body

但是一切都有办法。你的代码:

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

转换为以下URI调用:

<强> / API / getDailyFeedback?开始= 2018年5月1日

所以你已经获得了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传递params的其他方法是使用可选的uri段:

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以访问Nuxt get params,而无需其他模块。 只需使用:

  

req.request.get()