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

异步函数执行顺序异常致变量未定义,JSON字段为空求助

解决异步回调导致JSON字段为空的问题

这个问题的核心是异步操作的执行顺序导致的:你的blindSignature.sign函数内部使用了Key.find(这是一个异步的MongoDB查询操作),但函数本身是同步写法——当你调用blindSignature.sign时,查询还没完成,函数就已经返回了,所以拿到的signed是undefined,自然后续JSON里的对应字段为空。

下面是具体的修复方案:

步骤1:将sign函数改为返回Promise

把异步回调的逻辑包裹在Promise里,这样我们就能用async/await来等待异步操作完成:

exports.sign = function(mensaje, cantidad) {
  console.log('Firma ciega');
  return new Promise((resolve, reject) => {
    Key.find({"valor": cantidad}, function (err, clave) {
      if (err) {
        // 把错误传递出去,方便后续捕获
        return reject(err);
      }
      // 这里建议加个判断,避免找不到clave时出现报错
      if (!clave || clave.length === 0) {
        return reject(new Error("No se encontró la clave correspondiente a la cantidad"));
      }
      const d = clave[0].d;
      const n = clave[0].n;
      const signed = bigInt(mensaje).modPow(d, n);
      console.log("Mensaje firmado en módulo: " + signed.toString());
      // 把计算好的signed返回
      resolve(signed);
    });
  });
};

步骤2:修改路由处理函数为异步函数

用async标记路由处理函数,然后用await等待sign函数的结果,确保拿到signed的值后再继续后续逻辑:

router.post('/sign', async function(req, res) {
  try {
    const id_server = serverKeys.id_server;
    const id_client = req.body[0].A;
    const moneda = req.body[2].coin;
    const cantidad = req.body[3].cantidad;
    
    // 等待异步签名完成,拿到正确的signed值
    const signed = await blindSignature.sign(moneda, cantidad);
    console.log('Mensaje firmado en la api: ' + signed);
    
    const data = [{"A": id_server}, {"B": id_client}, {"coin_signed": signed}, {'cantidad': cantidad}];
    const Po = nonRepudiation.gethash(data);
    const response = [{"A": id_server}, {"B": id_client}, {"signed": signed}, {'cantidad': cantidad}, {'Po': Po}, {'status': "Mensaje firmado"}];
    
    res.status(200).send(response);
  } catch (err) {
    // 统一处理错误,返回友好的错误响应
    console.error('Error en el proceso de firma:', err);
    res.status(500).send({status: "Error", mensaje: "Ocurrió un error al firmar el mensaje", detalle: err.message});
  }
});

为什么这样能解决问题?

原来的Key.find是异步操作,代码会先执行完blindSignature.sign的调用,继续往下走,而不会等数据库查询完成。改成Promise+async/await后,路由函数会在await处暂停,直到sign里的数据库查询完成并返回signed的值,这样后续的data和response里就能拿到正确的签名值了。

内容的提问来源于stack exchange,提问作者Roberto Arranz Trullols

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:41:12