关于node数据库操作的异步问题以及其中的一些小坑

        最近在做毕业设计,后端用的node以及Mongo数据库。因为node的异步问题,遇到了一些小坑,虽然不是什么大问题,很快就解决了,在这里与大家分享一下,避免大家走不必要的弯路。废话不多说,直接上代码。

const Monk = require('monk');
const db = new Monk('localhost/Graduation_project'); // 链接到库
const user = db.get('User');

async function technologySharing () {
    let test0 = user.find({ userName: '王' });
    console.log(test0);
    // 错误
    
    let test1 = await user.find({ userName: '王' });
    console.log(test1);
    // 正确



    let test2 = await user.find({ userName: '王' }).length;
    console.log(test2);
    // 错误
    
    let test3 = (await user.find({ userName: '王' })).length;
    console.log(test3);
    // 正确
    
    let test4 = await user.find({ userName: '王' });
    console.log(test4.length);
    // 正确

    return '测试';
}

        大体是这样,我在操作数据库的时候,因为语言特性的原因,我们用普通的操作不会取得正确的数据,解决的方法也很简单,用 async/await 就能轻松解决,同时也一定程度上避免了烦人的回调地狱,提升了代码的简洁性和可读性。

-----------------------------------------------------------------------------手动分割-------------------------------------------------------------------------- ( ゜- ゜)つロ 

        我以为这样就结束了,在判断查询结果的时候没多想,就写下了类似 test2 的代码,结果一直报underfind,这让我好一阵纳闷,明明同步的问题已经解决了,那么这个 underfind是哪来的?仔细观察才发现,还是这个 await 的问题。在 test2 中,这个 await 实际上把 .length 也包进去了,这实际上是两个操作,首先查数据库取得结果,然后获取查询结果长度,而我们的 await 实际上只是想等待查数据库的操作,但是若是把 .length 包进去以后,就变成了等待这两个操作的结果,但这样的话这个查数据库的操作实际上还是异步的,解决方法也很简单,就是像 test3 和 test4 一样正确的使用 await 就好了。

        虽然在使用的时候很快就发现了问题所在,但还是一定程度上暴露了自己对知识的理解的欠缺,还是要虚心学习啊。

 

 

        感觉最近有些懈怠,趁着这次回实训基地答辩的路上思考了很多,决定做出一些改变,重启我蒙了一大层灰的博客(在这里非常感谢带我来到CSDN的贺利坚老师,同时也感到羞愧一直没有按照老师的期望及时的更新博客),一方面交流分享,总结经验,另一方面不断督促自己。人一旦懈怠,就会停止进步。以后如果没有特殊情况,会保证一周一篇的更新。在这里欢迎大家交流分享自己的心得体会,提出的意见建议和指出的问题我也都会虚心接受。

 

永远走在学习的路上。

 

你可能感兴趣的:(node,技术分享)