当前位置: 首页 > 编程笔记 >

轻松创建nodejs服务器(8):非阻塞是如何实现的

陈开宇
2023-03-14
本文向大家介绍轻松创建nodejs服务器(8):非阻塞是如何实现的,包括了轻松创建nodejs服务器(8):非阻塞是如何实现的的使用技巧和注意事项,需要的朋友参考一下

这节我们来了解一下nodejs实现非阻塞操作的方法。

我们先来修改一下 start的处理程序


var exec = require("child_process").exec;

function start() {

  console.log("Request handler 'start' was called.");

  var content = "empty";

  exec("ls -lah", function (error, stdout, stderr) {

 content = stdout;

  });

  return content;

}

 

function upload() {

  console.log("Request handler 'upload' was called.");

  return "Hello Upload";

}

 

exports.start = start;

exports.upload = upload;

这段代码,创建了一个新的变量content(初始值为“empty”),执行“ls -lah”命令,将结果赋值给content,最后将content返回。

我们引入了一个新的Node.js模块,child_process,之所以用它,是为了实现一个既简单又实用的非阻塞操作:exec()。

那么exec()做了什么呢?

它从Node.js来执行一个shell命令。在上面的例子里,我们用它来获取当前目录下所有的文件(“ls -lah”),然后,当/startURL请求的时候将文件信息输出到浏览器中。

我们启动服务器,访问“http://localhost:8888/start”我们会发现页面输出的内容是 empty。

exec()发挥作用了,有了它,我们可以执行非常耗时的shell操作而无需迫使我们的应用停下来等待该操作。

虽然如此,但是页面输出的内容似乎不是我们想要的结果。

我们来分析一下原因:

我们的代码是同步执行的,这就意味着在调用exec()之后,Node.js会立即执行 return content ;

在这个时候,content仍然是“empty”,因为传递给exec()的回调函数还未执行到——因为exec()的操作是异步的。

下一节我们将介绍如何解决这个问题。

 类似资料:
  • 本文向大家介绍轻松创建nodejs服务器(9):实现非阻塞操作,包括了轻松创建nodejs服务器(9):实现非阻塞操作的使用技巧和注意事项,需要的朋友参考一下 我们要将response对象(从服务器的回调函数onRequest()获取)通过请求路由传递给请求处理程序。随后,处理程序就可以采用该对象上的函数来对请求作出响应。 我们先对server.js做出修改: 我们将response对象作为第三个

  • 本文向大家介绍轻松创建nodejs服务器(7):阻塞操作的实现,包括了轻松创建nodejs服务器(7):阻塞操作的实现的使用技巧和注意事项,需要的朋友参考一下 我们来看一下什么是阻塞操作; 我模拟一个sleep()方法来使hello star延迟10秒打印。 requestHandlers.js 请求/start的时候,延迟了10秒才打印。 请求/upload的时候,并不会受影响。 接下来做一个试

  • 本文向大家介绍轻松创建nodejs服务器(4):路由,包括了轻松创建nodejs服务器(4):路由的使用技巧和注意事项,需要的朋友参考一下 服务器需要根据不同的URL或请求来执行不一样的操作,我们可以通过路由来实现这个步骤。 第一步我们需要先解析出请求URL的路径,我们引入url模块。 我们来给onRequest()函数加上一些逻辑,用来找出浏览器请求的URL路径: 好了,pathname就是请求

  • 本文向大家介绍轻松创建nodejs服务器(2):nodejs服务器的构成分析,包括了轻松创建nodejs服务器(2):nodejs服务器的构成分析的使用技巧和注意事项,需要的朋友参考一下 紧接上一节,我们来分析一下代码: 第一行请求(require)Node.js自带的 http 模块,并且把它赋值给 http 变量。 接下来我们调用http模块提供的函数: createServer 。 这个函数

  • 问题内容: 我正在努力使自己在nodejs中创建非阻塞的繁重计算。请看以下示例(从其他内容中删除): 可以想象,如果我同时打开2个浏览器窗口,第一个将等待10秒,另一个将等待20秒,这与预期的一样。因此,在知道回调以某种方式是异步的情况下,我删除了睡眠并改为放置: 具有简单定义的功能: 那当然是行不通的…我也曾尝试定义一个EventEmitter并向其注册,但是例如,发射器的主要功能在发出“完成”

  • 我有一个方法,可以启动一个简单的cpp grpc服务器。 我想做