如何从Promise中获取信息并返回值而非打印?附MSSQL代码示例
如何从mssql的Promise操作中返回结果值
我帮你调整一下代码,让它能正确从Promise里返回你需要的ID值,而不是只在内部处理。先梳理下你原有代码里的几个可以优化的点:
- 你当前
getCurrentId里resolve的是整个data.recordset,但实际上SCOPE_IDENTITY()返回的是单个ID值,我们可以直接提取这个值返回 - 代码格式过于紧凑,整理后可读性会好很多
main函数里有个多余的enter code here需要删掉
下面是修正后的完整代码:
function getCurrentId() { // 定义查询语句:插入空path后获取当前插入的ID const query = "INSERT INTO photos (path) VALUES (''); SELECT SCOPE_IDENTITY() AS id;"; const request = new mssql.Request(connection); return new Promise((resolve, reject) => { request.query(query, (err, data) => { if (err) { // 别忘了处理错误,否则reject不会被触发,外部无法捕获异常 return reject(err); } // 提取结果集中第一个对象的id属性,直接返回具体数值 resolve(data.recordset[0].id); }); }); } // 修正后的main函数 const main = async () => { try { // 通过await获取getCurrentId的Promise返回值 const newPhotoId = await getCurrentId(); // 这里直接返回这个ID,外部调用main时就能拿到该值 return newPhotoId; } catch (err) { // 处理可能出现的数据库错误 console.error('获取ID失败:', err); throw err; // 如果需要外部处理错误,这里抛出异常即可 } }; // 调用main函数的示例: // main() // .then(id => console.log('新插入的照片ID:', id)) // .catch(err => console.error('操作出错:', err));
关键说明
- 精准返回值:把
resolve(data.recordset)改成resolve(data.recordset[0].id),让Promise直接返回插入后的ID数值,而非整个结果集 - 错误处理:添加了
err判断并调用reject(err),避免错误被静默吞掉,外部可以通过catch捕获异常 - 外部获取值:
main函数返回的是Promise对象,外部可以通过.then()拿到返回的ID,或者在另一个async函数里用await直接获取,比如:
async function handlePhotoUpload() { try { const photoId = await main(); // 这里就可以用photoId做后续操作,比如关联其他表、返回给前端等 console.log('拿到新照片ID:', photoId); } catch (err) { // 统一处理错误 } }
这样就能真正获取到Promise里的返回值,而不是只在内部处理啦。
内容的提问来源于stack exchange,提问作者Дмитрий Литвин
相关产品推荐
相关产品推荐

