【问题标题】:Pass button value from react to express将按钮值从反应传递到表达
【发布时间】:2021-03-08 22:26:12
【问题描述】:

我正在尝试创建一个反应应用程序,该应用程序在快速服务器中调用 api 并显示数据。用户可以按下一些按钮,这些按钮的值将被传递到 api 并显示正确的结果。

我的问题是将按钮值从反应传递到表达。我试过 req.params.query 但它返回未定义。请注意,按钮值来自不同的组件。

App.js

 class App extends Component {
  state = {
    data: {},
  };

  search = async (query) => { <-- query returns button value
    fetch('/api')
      .then((res) => res.json())
      .then((data) => console.log(data)); // console log for now
  };

  render() {
    const {data} = this.state;
    return (
      <div>
        <div className={styles.container}>
          <Tables data={data} />
        </div>
      </div>
    );
  }
}

server.js

const url = GET_CHANNEL_ID + 'hard coded result' + API_KEY; 

app.get('/api', async (req, res) => {
  console.log(req.params.query); <-- undefined
  request(url, (error, response, body) => { <-- this works fine
    if (!error && response.statusCode == 200) {
      var info = JSON.parse(body);
      res.send(info.items[0]);
      console.log(info); 
    }
  });
});

【问题讨论】:

    标签: reactjs api express


    【解决方案1】:

    假设你有一个解析中间件设置(因为后来的 Express 版本去掉了大多数中间件),那么它应该在 req.query 下,你需要作为参数传递。所以在前端你会有:

    fetch(`/api?q=${query}`)
    

    然后在您的服务器中有中间件,例如body-parser

    import bodyParser from 'body-parser';
    ...
    app.use(bodyParser.json());
    

    然后为您的路线:

    app.get('/api', async (req, res) => {
        console.log(req.query); // this should contain params object, with the query parameter under the 'q' property
        ...
    });
    

    【讨论】:

    • 我已经安装了 bodyParser,谢谢你我现在得到了查询参数。但是,有没有一种简单的方法可以摆脱 q="" 部分并留下价值?谢谢
    • 你必须以某种方式传递参数。获取请求需要被赋予该值,否则它将如何知道。您可以在此处查看一些答案,了解将参数添加到请求的各种方法,但它们基本上都是将参数添加到 URL 字符串的不同方法:stackoverflow.com/questions/35038857/…
    • 对不起,我应该澄清更多。我的意思是在将其传递到我的 api 之前,如何在 express 中删除 q=""。
    • 您的意思是在将其传递到您路线内的request(url, (error, ... 部分之前?由于该值是动态的,因此您不能将该 URL 定义为字符串,它需要是一个函数,例如 const url = (query) =&gt; GET_CHANNEL_ID + query + API_KEY;。然后在你的路线中你可以做request(url(req.query.q), (error, ...
    • 谢谢!非常感谢您的帮助:)
    【解决方案2】:

    您需要在 fetch 函数中将查询参数添加到您的 URL:

    search = async (query) => {
      // add query param to URL
      fetch(`/api?query=${query}`)
        .then((res) => res.json())
        .then((data) => console.log(data));
    };
    

    那么对于服务器你可以访问req.query对象来获取所有的查询参数:

    const url = GET_CHANNEL_ID + 'hard coded result' + API_KEY; 
    
    app.get('/api', async (req, res) => {
      console.log(req.query); // { query: 'whatever you sent in fetch' }
      request(url, (error, response, body) => {
        if (!error && response.statusCode == 200) {
          var info = JSON.parse(body);
          res.send(info.items[0]);
          console.log(info); 
        }
      });
    });
    

    【讨论】:

    • req.params.query 在 express 中仍未定义。编辑 - req.query 给了我 { query: 'Value' } 我怎样才能摆脱查询部分? req.query.id 返回未定义
    • 编辑了我的答案以包括服务器部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多