异步函数执行顺序异常致变量未定义,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
相关产品推荐
相关产品推荐

