【问题标题】:Axios post request parameters to backend are undefinedaxios post请求参数到后端未定义
【发布时间】:2018-12-12 18:23:30
【问题描述】:

我正在创建一个简单的 ReactJs,并创建了一个 Searchbar 组件,当用户在搜索栏中输入内容时,它会发出一个发布请求。这是执行调用的函数:

const searchApi = searchTerm => 
axios.post('http://localhost:3000/findMovie', {
headers: {
  'Content-Type': 'application/json',
  'Access-Control-Allow-Origin': '*'
},
params: searchTerm
});

它在 onChange 函数中被调用,如下所示:

handleInput = async (ev) => {
const value = ev.target.value;
const resultsBody = await searchApi(ev.target.value);

这就是我在server.js 文件中所做的:

app.post('/findMovie', (req, res) => {
console.log('request:', req.params);

// axios.get('http://www.omdbapi.com/?apikey='+ 
// process.env.OMDB_API_KEY + '&s=' +)
})

我希望后端的 console.log 向我显示请求参数,以便我稍后可以对外部 api 进行 api 调用并返回结果,但 console.log 显示一个空对象。

我对此很陌生,但我不应该为这样的事情做一个发布请求吗?我也尝试了相同的获取请求,但它也没有工作。

【问题讨论】:

    标签: javascript node.js reactjs axios


    【解决方案1】:

    您的问题是由 axios 和 express 之间的命名混淆引起的。 axios 中的params 属性在 url 中作为搜索参数发送。

    在 express url 搜索参数可通过query 属性获得,而不是params。所以,试试这个:

    app.post('/findMovie', (req, res) => {
      console.log('request:', req.query);
    })
    

    快速请求对象上的params 属性引用命名路由参数,如/users/:userId/edit

    在 express 文档中了解更多信息:https://expressjs.com/en/guide/routing.html#route-parameters

    更新

    此外,为了使axios.post 方法正常工作,您需要稍微更改您的调用。它期望发布数据是第二个参数。由于您没有在正文中发送任何数据,因此您可以提供一个空对象:

    const searchApi = searchTerm => 
    
        axios.post('http://localhost:3000/findMovie', {} /* <-- this guy */, {
        headers: {
          'Content-Type': 'application/json',
          'Access-Control-Allow-Origin': '*'
        },
        params: searchTerm
      });
    

    没有它,您的配置对象会被错误地视为发布数据。

    【讨论】:

    • 很好,现在我在 console.log 中获得了我想要的值,但我不得不将两者都更改为 get 请求。 get 请求是我需要的还是必须是 post 请求,因为我的印象是,每当您将数据发送到后端时,它都必须是 post 请求。
    • 您可以发送 POST 或 GET(或任何其他方法,如 PUT、DELETE 等)到后端,这取决于它是如何完成的,例如这里您有 app.post,所以它只会工作对于 POST,但请随意使用您需要的任何方法。查找有关 REST API 的文档,其中每个操作对应一个方法。
    • 在向服务器发送数据时我会坚持发布。您仍然可以通过 axios.post 进行一些更改。问题是 post 方法期望数据对象作为第二个参数,而配置作为第三个参数。在您的示例中,您将配置作为第二个传递,因此它将其视为数据。添加一个空对象作为第二个参数,你应该很好。
    • 好的,我会调查的。似乎它有效。谢谢@GlebKost
    【解决方案2】:

    试试你的 axios 函数,将params 属性设置为对象:

    const searchApi = searchTerm => 
        axios.post('http://localhost:3000/findMovie', {
        headers: {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Origin': '*'
        },
        params: { searchTerm }
    });
    

    而在服务器上你需要使用req.query:

    app.post('/findMovie', (req, res) => {
        console.log('request:', req.query);
    })
    

    您应该能够将参数设置为req.query.searchTerm

    【讨论】:

    • 我猜它不适用于发布请求,当我将其更改为获取请求时,我正在获取数据。
    猜你喜欢
    • 2020-10-26
    • 2021-06-08
    • 2021-10-13
    • 1970-01-01
    • 2020-04-03
    • 2021-11-30
    • 2021-02-11
    • 1970-01-01
    • 2019-02-28
    相关资源
    最近更新 更多