Node.js

Node.js 知识量:9 - 37 - 115

8.1 基础功能><

请求方法- 8.1.1 -

在Node.js中,可以使用内置的HTTP模块来创建服务器,并处理不同的HTTP请求方法。下面是一个简单的示例,演示了如何使用Node.js实现GET和POST请求方法:

const http = require('http');  
  
const server = http.createServer((req, res) => {  
  // 获取请求方法  
  const method = req.method;  
  
  // 根据请求方法执行相应的操作  
  switch (method) {  
    case 'GET':  
      // 处理GET请求  
      res.writeHead(200, { 'Content-Type': 'text/plain' });  
      res.end('Hello, GET!');  
      break;  
    case 'POST':  
      // 处理POST请求  
      res.writeHead(200, { 'Content-Type': 'text/plain' });  
      res.end('Hello, POST!');  
      break;  
    default:  
      // 处理其他请求方法  
      res.writeHead(405, { 'Content-Type': 'text/plain' });  
      res.end('Method Not Allowed');  
  }  
});  
  
// 监听端口并启动服务器  
server.listen(3000, () => {  
  console.log('Server started on port 3000');  
});

在这个示例中,使用http.createServer()方法创建了一个HTTP服务器。在回调函数中,通过req.method获取请求方法的字符串表示形式,然后使用switch语句根据不同的请求方法执行相应的操作。对于GET和POST请求,只是简单地返回一个响应,对于其他请求方法,返回一个405状态码表示方法不被允许。

路径解析- 8.1.2 -

在Node.js中,可以使用请求对象的url属性或path属性来获取请求的路径,并根据路径进行相应的处理。以下是一个简单的示例:

const http = require('http');  
  
const server = http.createServer((req, res) => {  
  // 获取请求路径  
  const path = req.url || req.path;  
  
  // 根据路径执行相应的操作  
  switch (path) {  
    case '/':  
      // 处理根路径请求  
      res.writeHead(200, { 'Content-Type': 'text/plain' });  
      res.end('Hello, root!');  
      break;  
    case '/about':  
      // 处理/about路径请求  
      res.writeHead(200, { 'Content-Type': 'text/plain' });  
      res.end('About page');  
      break;  
    default:  
      // 处理其他路径请求  
      res.writeHead(404, { 'Content-Type': 'text/plain' });  
      res.end('Not Found');  
  }  
});  
  
// 监听端口并启动服务器  
server.listen(3000, () => {  
  console.log('Server started on port 3000');  
});

在这个示例中,通过req.url或req.path获取请求的路径,并根据路径执行相应的操作。如果请求的路径是根路径/,返回一个欢迎消息;如果请求的路径是/about,返回一个关于页面的内容;对于其他路径,返回一个404状态码表示未找到。

查询字符串- 8.1.3 -

在Node.js中,可以使用内置的querystring模块来解析和操作查询字符串。以下是一个简单的示例,演示了如何使用querystring模块来解析查询字符串并提取参数:

const querystring = require('querystring');  
const http = require('http');  
  
const server = http.createServer((req, res) => {  
  // 获取查询字符串  
  const query = querystring.parse(req.url.split('?')[1]);  
  
  // 提取参数  
  const foo = query.foo;  
  const baz = query.baz;  
  
  // 根据参数执行相应的操作  
  if (foo === 'bar' && baz === 'val') {  
    res.writeHead(200, { 'Content-Type': 'text/plain' });  
    res.end('Parameters matched!');  
  } else {  
    res.writeHead(400, { 'Content-Type': 'text/plain' });  
    res.end('Parameters did not match');  
  }  
});  
  
// 监听端口并启动服务器  
server.listen(3000, () => {  
  console.log('Server started on port 3000');  
});

在这个示例中,首先使用querystring.parse()方法解析查询字符串,然后通过req.url.split('?')[1]获取查询字符串。然后,使用querystring.parse()方法将查询字符串解析为一个对象,并从中提取参数。最后,根据参数的值执行相应的操作。

Cookie- 8.1.4 -

在Node.js中,可以使用内置的http模块来创建服务器,并通过res.setHeader()方法设置Cookie。以下是一个简单的示例,演示了如何设置和读取Cookie:

const http = require('http');  
  
const server = http.createServer((req, res) => {  
  // 设置Cookie  
  res.setHeader('Set-Cookie', ['foo=bar', 'baz=val']);  
  
  // 读取Cookie  
  const cookies = req.headers['cookie'];  
  if (cookies) {  
    const cookieValues = cookies.split('; ').map(cookie => cookie.split('=')[1]);  
    console.log('Cookies:', cookieValues);  
  }  
  
  // 返回响应  
  res.writeHead(200, { 'Content-Type': 'text/plain' });  
  res.end('Hello, World!');  
});  
  
// 监听端口并启动服务器  
server.listen(3000, () => {  
  console.log('Server started on port 3000');  
});

在这个示例中,首先使用res.setHeader()方法设置Cookie。该方法接受两个参数:Cookie的名称和值。可以通过传递一个包含多个Cookie的数组来设置多个Cookie。然后,可以通过req.headers['cookie']读取请求头中的Cookie。该属性返回一个包含所有Cookie的字符串,可以通过将其分割和解析来获取每个Cookie的值。最后,返回一个简单的响应,并在控制台中打印出读取到的Cookie值。

Session- 8.1.5 -

在Node.js中,可以使用内置的http模块和express框架来实现会话(Session)功能。以下是一个简单的示例,演示了如何使用express-session中间件来管理会话:

const express = require('express');  
const session = require('express-session');  
const http = require('http');  
  
const app = express();  
  
// 配置会话中间件  
app.use(session({  
  secret: 'your_secret_key', // 用于签名会话ID cookie的密钥  
  resave: false, // 强制将会话保存回会话存储区,即使会话在请求期间未被修改。  
  saveUninitialized: true, // 强制将未修改的会话保存到存储区。新创建的未修改的会话将不会被保存。  
  cookie: { secure: true } // 强制使用安全cookie,仅在HTTPS连接上发送。  
}));  
  
// 在这里添加路由处理程序和其他中间件...  
  
// 创建HTTP服务器并监听端口  
const server = http.createServer(app);  
server.listen(3000, () => {  
  console.log('Server started on port 3000');  
});

在这个示例中,首先通过require('express')和require('express-session')引入所需的模块。然后,使用app.use()方法将express-session中间件添加到应用程序中。在中间件的配置对象中,指定了会话的密钥、是否强制保存会话以及Cookie的安全选项。接下来,可以添加路由处理程序和其他中间件来处理请求和响应。最后,使用http.createServer()方法创建HTTP服务器,并通过监听指定的端口来启动服务器。

缓存- 8.1.6 -

在Node.js中,可以使用不同的缓存库来实现缓存功能,如node-cache、redis等。以下是一个使用node-cache库的简单示例:

首先,需要通过npm安装node-cache库:

npm install node-cache

然后,可以在代码中使用它:

const NodeCache = require('node-cache');  
  
// 创建一个缓存实例  
const myCache = new NodeCache({ stdTTL: 5 }); // 这里的5表示缓存有效期为5秒  
  
// 获取缓存数据  
const cachedData = myCache.get('key');  
if (cachedData) {  
  console.log('Cached data found:', cachedData);  
} else {  
  // 获取数据并缓存  
  const data = fetchDataFromDatabase(); // 假设fetchDataFromDatabase是一个获取数据的函数  
  myCache.set('key', data); // 将数据缓存起来  
  console.log('Cached data:', data);  
}

在这个示例中,首先通过require('node-cache')引入node-cache库,并创建一个缓存实例。然后,使用myCache.get()方法获取缓存数据。如果缓存中存在数据,则直接返回数据;否则,从数据库或其他来源获取数据,并将其缓存起来。可以根据自己的需求选择合适的数据来源和缓存策略。

Basic认证- 8.1.7 -

Basic认证是当客户端与服务器端进行请求时,允许通过用户名和密码实现的一种身份认证方式。在Node.js中,可以使用内置的http模块和querystring模块来实现基本的HTTP认证。以下是一个简单的示例,演示了如何使用http模块发送带有基本认证的请求:

const http = require('http');  
const querystring = require('querystring');  
  
const username = 'your_username';  
const password = 'your_password';  
  
const options = {  
  hostname: 'example.com',  
  port: 80,  
  path: '/path',  
  method: 'GET',  
  headers: {  
    'Authorization': 'Basic ' + new Buffer(username + ':' + password).toString('base64')  
  }  
};  
  
const req = http.request(options, (res) => {  
  let data = '';  
  
  // 读取响应数据  
  res.on('data', (chunk) => {  
    data += chunk;  
  });  
  
  res.on('end', () => {  
    console.log(JSON.parse(data)); // 打印响应数据  
  });  
});  
  
req.on('error', (error) => {  
  console.error(error);  
});  
  
req.end();

在这个示例中,首先引入了http和querystring模块。然后,设置了请求的选项,包括主机名、端口、路径、方法和请求头。在请求头中,使用Authorization字段来发送基本认证信息。将用户名和密码连接起来,并使用Buffer和toString('base64')方法将其转换为Base64编码的字符串。最后,使用http.request()方法发送请求,并在响应数据读取完成后打印响应数据。