最近,在用nodejs连接mongoDB数据库时出现了一个特别蛋疼的问题,我们先来看代码
下面我来解释一下代码——这个取名叫mongoB.js的文件主要实现监听来着客户端的post请求,这个请求是客户端页面通过window.onload方法再使用原生的XMLHttpRequest对象实现的。首先,js通过http模块监听指定端口,在获取到客户端请求的时候,通过判断参数来选择将要对数据库进行的操作——因为我想之后实现完整的增删改查功能,所以我准备将对数据库进行不同操作的代码分别写在不同的函数中,在serverHttp.on(“request”,function(){})中通过判断参数的不同来调用不同的函数。现在,我就让客户端传find:all这一个参数。然后再调用函数实现对数据库的查找。result全局变量的设置是在对数据库操作发送错误的时候记录错误信息,并且返回到客户端。但现在运行程序之后出现了这个东东
它的意思是“第一个参数必须是字符串或缓冲区”,这就让我很懵逼,一开始我相信出问题的应该是result的赋值上,在反复的修改之后,终于在下面这个样子的时候命令行没有报错,但客户端收到的却是”x”
这证明在查找函数中result的值没有被改变,同时,在交换
这部分中的result与back之后,发现之所以会出现“第一个参数必须是字符串或缓冲区”这个错误的原因是因为res.write()方法只接受字符串或者二进制对象作为参数。当时,我认为db.open()方法应该不能访问定义在方法外部变量,让我做出这个判断的是下面这个例子
在这种例子中,我直接在open方法前面定义x=”xxx”,如果数据库访问成功,则修改x的值,无论访问成不成功都返回x的值。这样一来的结果是数据库访问成功了,但x的值仍然是xxx。但是,后面我突然想到,open方法是一个有回调函数的方法,结合nodejs非阻塞的性质,一切就都解释通了。
首先,在代码执行到var back=find()这里时,进入find()函数,但find函数内部的open方法是异步操作,所以代码继续执行var back=find()后面的部分,这导致result的值不会改变,自然而然,发送给客户端的就是result之前的值。这也解释了为什么find()方法不能return正确的值了,因为return之前,res.write就已经执行了。如果我们将代码改成下面这样子,那就可以正确运行了
这里与其将数据库查询的结果return回去,不如把res对象传给open方法,在open方法的回调函数中将结果发送给客户端。
虽然说回调函数不一定有异步发送,但大家还是多长个心眼,多留意一下下。
nodejs连数据库时出现的异步问题
最新推荐文章于 2024-09-07 08:00:00 发布