在react中使用Fetch,需要用户名密码才能访问数据库

IT技术 php mysql reactjs fetch
2021-05-11 20:56:36

我已经对此进行了数小时的研究,但找不到我需要的答案。对不起,如果有人问过这个问题并且我的研究很糟糕,如果是这样,只需链接有用的堆栈溢出页面,我就会开心。这是我的问题的摘要。

我在上 CS4 班,我们正在设计自己的网页,必须使用我们学校的服务器进行数据库存储。我们学习了 php 以及如何使用 mySQL,我们对服务器的 POST 和 GET 请求如下所示(用 PHP 编写):

require("config.php");

$db = new PDO("mysql:dbname=" . $GLOBALS["database"] . ";host=" . $GLOBALS["hostname"] . ";port=" . $GLOBALS["port"], 
$GLOBALS["username"], $GLOBALS["password"]);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$query = "SELECT * FROM Karrsen_ajaxtest"; 
$statement = $db->prepare($query);
$statement->execute();
$rows = $statement->fetchAll();
foreach ($rows as $row) {
    print(strip_tags($row['name']) . "<br/>");
}

配置设置正确的地方。

现在我正在做我的最终项目 React.js 并且必须从同一服务器请求。我想使用内置的 Fetch 系统,但它会引发 CORS 错误,而且我也不知道如何添加上述用户名、密码、数据库和主机名。我已经彻底浏览了 MDN 网络文档(认为它可能是请求标头、凭据、模式或完整性?)但除了说是否必须将自己添加到服务器上的 Access-Control-Allow-Origin 之外没有找到太多内容(但我无法编辑学校服务器的设置。)

如何添加这些凭据?我会继续收到 CORS 错误吗?对不起,如果这是浪费你的时间,对堆栈溢出了解不多

*编辑我有我的react应用程序,其中我现在唯一的组件将是一些登录内容。它被称为 Login.JS。现在我想要它做的就是在提交表单时从数据库中获取数据。这是我的代码。

import React from 'react';

class Login extends React.Component{
  constructor (props) {
    super(props);

    this.state = {
        userName: "",
        password: "",
        hits: [],
    };

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange = event => {
    this.setState({
        [event.target.name]: event.target.value
    });
  }

  handleSubmit(e) {
    console.log(e);
    e.preventDefault();
    this.updateFromDB();
  }

  formValidation() {
    return this.state.password.length > 0 && this.state.userName.length > 0;
  }

  updateFromDB(){
    let API = "THE_URL_FOR_MY_DATABASE";
    let query = "SELECT * FROM karrsen_test";
    fetch(API + query, {
        method: 'POST',
        mode: 'cors'
    })
    .then(response => response.json())
    .then(data => this.setState({ hits: data.hits }));
  }

  render (){
    return(
        <div className= "Login-form">
            <form onSubmit = {(e) => this.handleSubmit(e)}>
                <label>
                    Username:
                    <input 
                    type = "text" 
                    value = {this.state.userName} 
                    onChange = {this.handleChange} 
                    name = "userName"/>
                </label>
                <label> 
                    Password:
                    <input
                    type = "text"
                    value = {this.state.password}
                    onChange = {this.handleChange}
                    name = "password" />
                </label>
                <input 
                    disabled = {!this.formValidation()}
                    type = "submit" />
            </form>
        </div>
    )

  }
}

export default Login;
1个回答

默认情况下使用启用 CORS fetch,但您的服务器需要配置为处理跨源请求。

假设您学校的服务器正在运行 Apache,您应该能够通过将 .htaccess 文件添加到您的 PHP 目录中来做到这一点。只需命名文件.htaccess并添加以下行。

Header set Access-Control-Allow-Origin "*"

这需要将 Apache 服务器配置为允许在DocumentRoot. DocumentRoot是根目录Apache正在托管。例如,假设您从/var/www/example目录中托管 example.com /var/www/example是 DocumentRoot。

在 example.com 的 Apache 配置中,AllowOverride必须设置指令以允许.htaccess文件覆盖基本配置 - 否则.htaccess文件将被忽略。

要使 Apache 能够控制和修改 HTTP 请求和响应标头,mod_headers必须启用module。从终端输入以下命令。

a2enmod headers

如果所有其他方法都失败了,您可以尝试使用 PHP 编辑响应(来自服务器)HTTP 标头,方法是将以下行添加到您的 PHP 脚本中 - 可能在其他任何内容之前的顶部。

header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");