求助:异步函数返回undefined,如何实现Promise正确传值?
解决你的Promise异步函数返回undefined问题
我来帮你一步步修复这段代码,问题主要出在两个核心点,还有一个必须注意的安全隐患:
1. 函数未返回Promise实例
你在函数内部创建了promise1,但没有把它返回出去——这就是调用maFonctionAsynchrone()得到undefined的直接原因。首先给函数加上返回语句:
function maFonctionAsynchrone(pseudo) { var promise1 = new Promise(function(resolve, reject) { connection.query("SELECT * FROM users WHERE MATCH (username) AGAINST ('" + pseudo + "')", function (error, results, fields) { if (!!error) { console.log('erreur'); reject(error) } else { resolve(results); // 这里不需要return results,resolve已经把结果传递给Promise的后续处理了 } }); }); return promise1; // 关键:返回创建的Promise对象 }
2. 正确处理异步结果
Promise是异步执行的,直接console.log(maFonctionAsynchrone('pseudotest'))打印的是Promise实例本身,而非查询结果。你需要用以下两种方式之一获取异步结果:
方法一:使用.then()链式调用
app.post('/sendnewpost', function(req, res){ maFonctionAsynchrone('pseudotest') .then(results => { console.log(results); // 这里才能拿到实际的数据库查询结果 // 可以在这里给客户端返回响应,比如 res.json(results) }) .catch(error => { console.error('查询出错:', error); res.status(500).send('查询失败'); }); });
方法二:使用async/await语法(更简洁直观)
把路由处理函数改成async函数,用await等待Promise完成:
app.post('/sendnewpost', async function(req, res){ try { const results = await maFonctionAsynchrone('pseudotest'); console.log(results); res.json(results); } catch (error) { console.error('查询出错:', error); res.status(500).send('查询失败'); } });
3. 重要安全提醒:避免SQL注入
你现在直接把pseudo拼接到SQL语句里,这会导致严重的SQL注入漏洞。一定要用参数化查询来修复,具体写法取决于你使用的数据库驱动(比如mysql/mysql2),示例如下:
// 修改maFonctionAsynchrone中的query调用 connection.query( "SELECT * FROM users WHERE MATCH (username) AGAINST (?)", [pseudo], // 将参数放在数组中,驱动会自动处理转义,避免注入 function (error, results, fields) { if (!!error) { console.log('erreur'); reject(error) } else { resolve(results); } } );
内容的提问来源于stack exchange,提问作者Ke Vin
相关产品推荐
相关产品推荐

