读Node入门有感——>【1】构建基础的HTTP服务器
我们可以把不同功能的代码放入不同的模块中,保持代码分离——这种方法允许你拥有一个干净的主文件(main file),你可以用Node.js执行它;同时你可以拥有干净的模块,她们可以被主文件和其他的模块调用
一般情况下把主文件叫做index.js。把服务器模块放进叫server.js的文件里。
让我们先从服务器模块开始。在项目的根目录下创建一个叫server.js的文件,并写入一下代码:
var http = require("http");
http.createServer(function(request,response){
response.writeHead(200,{"Content-Type":"text/plain"});
response.write("Hello World");
response.end()
}).listen(8888);
搞定!刚刚完成了一个可以工作的HTTP服务器。为了证明这一点,我们来运行并且测试这段代码。首先,用Node.js执行脚本:
node server.js
接下来,打开浏览器访问http://localhost:8888/,就会看到一个写着“Hello World”的网页。
分析以上HTTP服务器
第一行请求(require)是Node.js自带的http模块,并且把它赋值给http变量。
接下来我们调用http模块提供的函数:createServer。这个函数会返回一个对象。这个对象有一个listen方法,这个方法有一个数值参数,指定这个HTTP服务器监听的端口号。
在JavaScript中,一个函数可以作为另一个函数接收的一个参数。我们可以先定义一个函数,然后传递,也可以在传递参数的地方直接定义函数。如下所示:
例1:
function say(word){
console.log(word);
}
function execute(someFunction,value){
someFunction(value);
}
execute(say,"Hello");
这里我们把say函数先定义为一个变量进行传递。这里传递的不是say的返回值,而是say本身!
当然,因为say有一个变量,execute在调用someFunction时可以传递这样一个变量。
例2:
function execute(someFunction,value){
someFunction(value);
}
execute(function(word){
console.log(word)
},"Hello");
这里是直接在传递过程中直接定义,也称为匿名函数。
函数传递是如何让HTTP服务器工作的
现在它看上去应该清晰了很多:我们向createServer函数传递了一个匿名函数。
用一下代码也可以达到同样的目的:
var http = require("http");
function onRequest(request,response){
response.writeHead(200,{"Content-Type":"text/plain"});
response.write("Hello World");
response.end();
}
http.createServer(onRequest).listen(8888);
如何证明,在创建完服务器之后,即使没有HTTP请求进来、我们的回调函数也没有被调用的情况下,我们的代码继续有效呢?我们试试这个
var http = require("http");
function onRequest(request,response){
console.log("Request received");
response.writeHead(200,{"Content-Type":"text/plain"});
response.write("Hello World");
response.end();
}
http.createServer(onRequest).listen(8888);
console.log("Server has started");
注意:在onRequest(回调函数)触发的地方,我用console.log输出了一段文本。在HTTP服务器开始工作之后,也输出一段文本。
当我们与往常一样,运行它node server.js,它会马上在命令行上输出“Server has started”。当我们向服务器发出请求(在浏览器中访问http://localhost:8888/),"Request received."这条消息就会在命令行中出现。
这就是事件驱动的异步服务器端JavaScript和它的回调啦!
(请注意:当我们在服务器访问网页时,我们的服务器可能会输出两次“Request received.”。;那是因为大部分浏览器都会在你访问http://localhost:8888/时尝试读取http://localhost:8888/favicon.ico)
待续。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现