1. Nodejs中的http模块
Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,主要用于开发服务端网络应用。它提供了许多原生模块,其中一个重要的模块是http模块。http模块提供了一组API,可用于建立或访问HTTP服务器/客户端。
在Node.js中,要使用http模块,需要首先引入(require)http模块:
const http = require('http');
然后,可以使用http.createServer()方法创建一个HTTP服务器对象,该方法会返回一个Server实例。
const server = http.createServer((req, res) => {
// 请求处理逻辑
});
createServer()方法接收一个回调函数作为参数,回调函数必须处理客户端的每个请求并返回响应。回调函数传入两个参数,分别是req和res。req是一个表示HTTP请求的http.IncomingMessage对象,res是一个表示HTTP响应的http.ServerResponse对象。
1.1 http.createServer()方法
http.createServer()方法可以接收一个可选选项对象作为第一个参数,用于配置服务器的一些属性。
下面是一个例子,使用http.createServer()方法创建一个HTTP服务器,监听8080端口:
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello World!');
res.end();
});
server.listen(8080, () => {
console.log('Server started on port 8080');
});
在上面的例子中,我们使用res.writeHead()方法设置响应头部信息,res.write()方法写入响应正文,res.end()方法结束响应,发送到客户端。
1.2 req对象
req对象是一个http.IncomingMessage实例,表示客户端HTTP请求。它包含了以下信息:
req.url:HTTP请求的URL
req.method:HTTP请求的方法,例如GET、POST等等
req.headers:HTTP请求的头部信息,包括Content-Type、Cookies等等
req.body:HTTP请求的请求体,用于POST请求等等
下面是一个例子,展示如何使用req对象:
const server = http.createServer((req, res) => {
console.log(req.url);
console.log(req.method);
console.log(req.headers);
console.log(req.body);
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello World!');
res.end();
});
1.3 res对象
res对象是一个http.ServerResponse实例,表示HTTP响应。它包含了以下方法和属性:
res.writeHead(statusCode[, statusMessage][, headers]):设置响应头部信息
res.write(chunk[, encoding][, callback]):将响应正文写入响应体
res.end([data][, encoding][, callback]):结束响应,并将响应发送到客户端
下面是一个例子,展示如何使用res对象:
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('Hello World!');
res.end();
});
2. 导出共享
在Node.js中,每个文件都被视为一个模块,因此模块化是Node.js的一个重要功能。Node.js中的模块化基于CommonJS规范,它定义了模块的导出和导入方式。在模块中,我们可以通过module.exports对象和exports对象导出模块中的内容。
2.1 module.exports
module.exports是Node.js中的一个特殊对象,用于导出模块中的内容。可以通过给module.exports赋值来导出一个对象,该对象可以是一个函数、一个对象、一个类等等。
下面是一个例子,展示如何使用module.exports导出一个函数:
// 导出一个函数
module.exports = function add(a, b) {
return a + b;
};
通过require()方法导入该模块,就可以使用导出的函数:
const add = require('./add');
console.log(add(1, 2)); // 输出 3
2.2 exports
exports是module.exports的一个引用,它可以被用来导出模块中的内容。因为exports只是module.exports的一个引用,所以我们可以向exports对象添加属性和方法,并且它们会被添加到module.exports对象中。
以导出一个对象为例子:
// 导出一个对象
exports.config = {
port: 8080,
host: 'localhost'
};
通过require()方法导入该模块,可以通过访问module.exports.config来访问导出的对象属性:
const config = require('./config');
console.log(config.port); // 输出 8080
我们还可以在exports对象中添加方法,下面是一个例子:
// 导出一个函数
exports.hello = function(name) {
console.log('Hello ' + name + '!');
};
通过require()方法导入该模块,就可以使用导出的函数:
const hello = require('./hello');
hello('world'); // 输出 Hello world!
2.3 module.exports和exports之间的差异
虽然exports对象和module.exports对象用于导出模块中的内容,但是它们之间有一些差异。
module.exports对象是最终要导出的对象,在模块被require()方法引入时,返回的是module.exports对象。
exports对象是module.exports对象的引用,它是一个简单的对象。当我们给exports对象赋值时,它会被覆盖,因此exports对象仅仅用于向对象上添加新属性。
下面的例子展示了exports对象和module.exports对象之间的差异:
// 导出一个对象
exports.config = {
port: 8080,
host: 'localhost'
};
// 导出一个函数
module.exports = function add(a, b) {
return a + b;
};
通过require()方法导入该模块,访问exports对象和module.exports对象:
const utils = require('./utils');
console.log(utils.config);
console.log(utils(1, 2));
执行结果如下:
{ port: 8080, host: 'localhost' }
3
上面的例子说明了,当exports对象和module.exports对象同时被使用时,最终导出的对象是module.exports对象而不是exports对象。
总结
Node.js中的http模块提供了一组API,可用于建立或访问HTTP服务器/客户端。通过http.createServer()方法创建一个HTTP服务器,可以处理客户端的每个请求并返回响应。req和res分别表示客户端HTTP请求和HTTP响应。
在Node.js中,每个文件都被视为一个模块,因此模块化是Node.js的一个重要功能,可以使用module.exports对象和exports对象导出模块中的内容。module.exports是Node.js中的一个特殊对象,用于导出模块中的内容。exports是module.exports的一个引用,它可以被用来导出模块中的内容。
exports对象和module.exports对象的差异在于:module.exports对象是最终要导出的对象,在模块被require()方法引入时,返回的是module.exports对象;exports对象是module.exports对象的引用,它是一个简单的对象,仅仅用于向对象上添加新属性。