[NodeJs]拿不到mysql查询返回的数据?你可能还没试过这招

  • 解决 nodejs 分离 mysql 模块后,能在模块内 console.log 出数据,主模块却拿不到的问题
  • 缘由
  • 解决方案
  1. 曾经在刚刚初学 nodejs 的时候,就想要把 nodejs mysql 链接起来;于是便在网络上简单学习了 nodejs 链接mysql的教程,但当时所有代码都挤在一个 app.js 里面,但当我去将 mysql 的模块专门从 app.js 中抽离的时候,问题发生了。(今天拿一个简单的小项目来举例)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 这样的写法,虽然能够 console.log 出数据,但是 app.js 是接收不到的(通过 console.log 逐步查找出来的原因),因此我们去访问这个接口,也拿不到任何数据
  • 虽然知道这大几率是异步的问题,但处理起来还是令人头疼
  • 因为这样的问题,大多都是执行函数,但 result 还没有被查询到并赋值,函数就已经给我返回了 result
  • 这里的执行顺序是,访问接口,触发 getdata() 函数,然后将返回值发送
    在这里插入图片描述
  • 而这里的执行顺序就比较有意思了,先是进入函数,然后进入db.query的函数体,此时 result 还没有被查询到,log也被略过,直接先执行了 return ,然后就返回了一个未被定义的空值
  • 如果你细心,去挨个调试输出也能发现这个奇妙的问题。
  • 而且,data 居然是先输出了 undefined ,而查询结果却在后面;显然,这是执行顺序的锅。
  1. 按照正常的逻辑,这些数据需要我每访问一次就从数据中查询一次,如果直接将查询过程变为一次性的(每次启动服务的时候才会重新去sql查询),那么就可以解决问题,但这怎么看,也不像解决了问题,很多数据是需要立即获取的,比如说很多实时更新的信息,这时候你想要通过重启服务才能查看最新信息,很显然是不现实的。

  2. 一时间,陷入僵局。。。

  1. 因为这个问题,我翻阅了其他人上百篇的博客,发现此类的极少,因为他们做演示的时候大多都是在一个 app.js文件下执行的,根本没有分离的过程,也没有这样的问题。

  2. 但功夫不负有心人,通过国外的几篇问题贴,我强忍着翻译后生硬的话语,去看出了其中的玄机。

  3. 直接获取不到的结果,可以通过回调函数来返回。

  4. 改造。。。。

  5. 改造后的代码如下

在这里插入图片描述
在这里插入图片描述
6. 在写法上的确和之前有了变动,这次我们再次打开浏览器,数据跃然屏上

创作不易 欢迎点赞收藏

问题: Node.js 作为后台,但是接口的res.body获取到的一直是空对象 描述: node作为后台,接口设置成post请求,之后再请求中加入了一个对象作为body的参数,但是无论写什么,后台接口的参数res.body一直是一个空对象,获取 不到 前台的值 解决: 是不是没有设置请求的Content-Type属性,不管是axios还是postman在都需要在header中将Content-Type设置成application/json,这样后台才可以获取到值 Error connecting to Database Error: Cannot enqueue Handshake after already enqueuing a Handshake. Error connecting to Database Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL 部署BAE提交GIT版本时报错 - RPC failed; result=22, HTTP code = 411 报错的主要内容是:RPC failed; result=22, HTTP code = 411; 原先以为是BAE上传文件大小有限制,最后查明导致该错误是因为默认 Git 设置 http post 的缓存为 1MB,只需要将其设置为更大值即可; 以下是报错内容 Count... 数据库 (database)是用来组织、存储和管理 数据 的仓库 为了方便管理互联网世界中的 数据 ,就有了 数据库 管理系统的概念(简称: 数据库 )。用户可以对 数据库 中的 数据 进行新增、 查询 、更新、删除等操作 2.2 常见的 数据库 以及分类 常见的 数据库 分类下面几种 MySQL 数据库 (目前使用 这是一个小项目里发现的问题,不是bug,也不属于逻辑问题,是一个小细节问题,问题截图如下: 这里从 前端 向后台发送了一条 数据 ,但是postman上显示是以存在用户,无法插入,主要是因为这个原因. if里的user的值是[ ],并不算空值,所以自动判断为 数据 存在,导致插入 数据 失败。 修改方式如下: JavaScript 是一种有趣的语言,我们都喜欢它,因为它的性质。浏览器是JavaScript的主要运行的地方,两者在我们的服务中协同工作。JS有一些概念,人们往往会对它掉以轻心,有时 可能 会忽略不计。原型、闭包和事件循环等概念仍然是大多数JS开发人员绕道而行的晦涩领域之一。正如我们所知,无知是一件危险的事情,它 可能 会导致错误。 接下来,来看看几个问题,你也可以试试想想,然后作答。 问题1:浏... 这个问题的原因是 node.js 外部引入包会在 node_module里面进行查找,如果你安装 node.js 的目录和项目文件的目录不一致,那么就无法引入外部包。因此,只需要在命令行中进入你的项目文件根目录,然后 npm install mysql 即可解决。... 这个问题花了我6个小时!无论是使用回调函数、还是使用 Promise,query 死活没反应。 数据库 连接正常,新建一个项目来使用 数据库 也是正常。最后发现是版本问题,升级 pg(node-postgresql)到 8.2.0 版本就解决了! 结论:在使用 Node 14 时,要升级 pg 到 8.0 以上! 参考:https://github.com/brianc/node-postgres/issues/2069#issuecomment-619456031