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

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代码存在两个关键问题,导致返回的不是预期的哈希值:

  1. 先执行了echo $row[0];直接输出盐值,而后续的return $request;在Web环境中不会输出任何内容(PHP的return仅用于函数内部返回,无法输出到HTTP响应)。
  2. 存在严重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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:14:52