You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

表单提交报500错误及TypeError: Cannot read properties of undefined (reading 'text')

表单提交报错排查与修复

问题描述

开发了一个表单用于将数据保存至数据库applicant_need表,涉及字段coursetype、course_need、c_name、total。提交时触发服务器500错误,同时提示Cannot read properties of undefined (reading 'text'),怀疑问题出在response.text()处。

相关代码

HTML代码

<form id='addneed' class="intro-y box grid-cols-1 p-5">
    <div class="grid grid-cols-1 gap-4 row-gap-5 mt-5">
        <div class="intro-y col-span-12 sm:col-span-4 px-2">
            <div class="mb-2">Course Type</div>
            <select name="coursetype" onchange="course_type_handler()" id="course_type_id" class="input w-full border flex-1 " required="">
                <option">Choose an option</option>
                <?php $x = 1;
                if ($course_types->num_rows > 0) {
                    while ($rowm = $course_types->fetch_assoc()) { ?>
                        <option value="<?php echo $rowm['id']; ?>"><?php echo $rowm['name']; ?></option>
                <?php }
                } ?>
            </select>
        </div>
        <div class="intro-y col-span-12 sm:col-span-4 px-2">
            <div class="mb-2">Courses Need</div>
            <select name='course_need' id="select_courses_id"  class="input w-full border flex-1 " required="">
                <option >Choose an option</option>
            </select>
        </div>
        <div class="intro-y col-span-12 sm:col-span-4 px-2">
            <label>Other</label>
            <br>
            <div>
                <input type="radio" name='others'   onchange="radio_extra_handler()" class="input w-full border flex-1" >
            </div>     
        </div>  
        <br>
        <div class='intro-y col-span-12 sm:col-span-4 px-2' name='extra'  id="extra" style='display: none;'>
            <div class="mb-2">Course Name</div>
            <input name='c_name'   type="text" class="input w-full border flex-1"  placeholder="Enter course name">
            <div class="mb-2">Total</div>
            <input name='total'  type="number"  class="input w-full border flex-1" placeholder="Enter number of nominees">
        </div>                               
    </div>
    <div style="display: flex; justify-content: center; margin-top: 20px;">
        <button required type="submit" class=" button text-white bg-theme-1 shadow-md mr-2">Submit</button>
    </div>
</div>
</form>

JavaScript脚本

<script>
function handleErrors(response) {
    if (response?.ok) {
        console.log('Use the response here!');
    } else {
        console.log(`HTTP Response Code: ${response?.status}`)
    }
}
// Function to handle form submission
function handleSubmit(event) {
    // Prevent the default form submission behavior
    event.preventDefault();

    // Get form elements and their values
    const form = event.target;
    const formData = new FormData(form);
    
    // Convert FormData to an object
    const formObject = {};
    formData.forEach((value, key) => {
        formObject[key] = value;
    });

    // Send form data to a PHP file using the Fetch API
    fetch('server/add_needs_server.php', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify(formObject),
    })
    .then(handleErrors)
    .then(response =>  response.text())  // 怀疑问题出在这里
    .then(data => {
        console.log(document.getElementById('course_type_id').value);
        console.log(document.getElementById('select_courses_id').value);

        if(data == "Inserted") {
            var coursename = document.querySelector('select[name=course_need]').value;
            var message = document.querySelector('.message');
            var response = document.querySelector('.response');

            message.innerHTML = alert( 'your request has been submitted' );

            message.classList.remove('failed');
            message.classList.add('success');
            response.classList.remove("hide");

            document.getElementById("addneed").reset();
        } else {
            var coursename = document.querySelector('select[name=course_need]').value;
            var message = document.querySelector('.message');
            var response = document.querySelector('.response');

            message.innerHTML =  alert( 'Failed to upload' + coursename  );

            message.classList.remove('success');
            message.classList.add('failed');
            response.classList.remove("hide");
        }
    })
    .catch(error => {
        console.error('Error:', error);
    });
}

// Get the form element and add a submit event listener
const myForm = document.getElementById('addneed');
myForm.addEventListener('submit', handleSubmit);
</script>

问题原因与修复方案

1. 前端Promise链断裂(直接导致"Cannot read properties of undefined"错误)

当前的handleErrors函数在响应成功时没有返回response对象,导致后续的.then(response => response.text())接收到的是undefined,调用undefined.text()就会触发报错。

修复handleErrors函数:

function handleErrors(response) {
    if (response?.ok) {
        console.log('Use the response here!');
        return response; // 必须返回response,保证Promise链传递数据
    } else {
        console.log(`HTTP Response Code: ${response?.status}`);
        throw new Error(`HTTP error! status: ${response.status}`); // 抛出错误,让后续catch捕获
    }
}

2. 服务器500错误(后端问题)

服务器500错误说明add_needs_server.php存在代码逻辑错误,常见原因:

  • 未正确解析JSON格式的请求体:前端发送的是JSON数据,PHP默认不会自动解析,需要手动获取并解析:
<?php
// 获取JSON请求内容
$rawData = file_get_contents('php://input');
$requestData = json_decode($rawData, true);

// 检查JSON解析是否成功
if (!$requestData) {
    http_response_code(400);
    echo "Invalid JSON data";
    exit;
}

// 后续执行数据库插入逻辑...
// 示例:假设插入成功后返回"Inserted"
echo "Inserted";
?>
  • 数据库连接异常、SQL语句错误:检查数据库配置是否正确,SQL语句是否存在语法错误(比如字段名拼写错误、缺少引号等)
  • 文件权限或路径错误:确认add_needs_server.php文件存在且服务器有读写权限

3. 其他前端细节问题

  • HTML中第一个option标签语法错误:<option">Choose an option</option>改为<option>Choose an option</option>
  • radio按钮缺少value属性:添加value="1"以便后端判断是否选中
  • message.innerHTML = alert(...)写法错误:alert返回undefined,应分开写:
// 替换原代码中的对应行
alert('your request has been submitted');
message.innerHTML = 'your request has been submitted';

内容的提问来源于stack exchange,提问作者Amani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:35:52