API返回Promise而非预期字符串,请求技术解决方案
问题解决:获取API返回的字符串值
一、JavaScript端:正确处理异步函数的返回值
async 函数的返回值本身就是一个 Promise,直接赋值给变量拿到的肯定是Promise对象,必须通过以下两种方式获取实际的字符串值:
方式1:使用await(需在async函数中调用)
把调用hashContrasena的代码包裹进async函数,用await接收结果:
// 外层逻辑改为async函数 async function handlePassword() { let contrasena = document.getElementById("InputPasswordSignup").value.trim(); if (contrasena !== ""){ // 用await获取异步函数的实际返回值 contrasena = await hashContrasena(contrasena); alert(contrasena); sql = sql.concat(" contraseña = '", contrasena).concat("',"); } } async function hashContrasena(pass){ const res = await fetch('/api/hash_input.php', { method: 'POST', body: pass }) return await res.text(); }
方式2:使用.then()链式调用
如果不想修改外层函数的异步状态,可以用then处理Promise:
let contrasena = document.getElementById("InputPasswordSignup").value.trim(); if (contrasena !== ""){ hashContrasena(contrasena).then(hashedPass => { contrasena = hashedPass; alert(contrasena); sql = sql.concat(" contraseña = '", contrasena).concat("',"); // 所有依赖contrasena的后续逻辑都要放在这里 }); } async function hashContrasena(pass){ const res = await fetch('/api/hash_input.php', { method: 'POST', body: pass }) return await res.text(); }
二、修复PHP端的逻辑错误
当前你的PHP代码存在两个关键问题,导致返回的不是预期的哈希值:
- 先执行了
echo $row[0];直接输出盐值,而后续的return $request;在Web环境中不会输出任何内容(PHP的return仅用于函数内部返回,无法输出到HTTP响应)。 - 存在严重SQL注入风险,直接将
$_SESSION['usuario']拼入SQL语句非常危险。
修改后的PHP代码:
<?php session_start(); include '../dbconn.php'; $request = file_get_contents('php://input'); $usuario = $_SESSION['usuario']; // 使用预处理语句防止SQL注入 $query = "SELECT sal FROM usuarios WHERE usuario = ? OR email = ?"; $stmt = mysqli_prepare($conn, $query); mysqli_stmt_bind_param($stmt, "ss", $usuario, $usuario); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $row = mysqli_fetch_array($result); // 拼接盐值并生成哈希 $request .= $row[0]; $hashedValue = hash('sha512', $request); // 输出哈希结果作为响应返回给前端 echo $hashedValue; ?>
关键提示
- 异步函数必须通过
await或.then()才能拿到实际返回值,这是JavaScript异步机制的核心规则。 - PHP在Web请求中,只有
echo、print等输出语句的内容才会作为HTTP响应返回给前端,return无法输出内容。 - 永远不要直接将用户输入(包括Session中的值)拼入SQL语句,必须使用预处理语句防范SQL注入。
内容的提问来源于stack exchange,提问作者user22741203
相关产品推荐
相关产品推荐

