2024-08-17

要实现远程公网访问Windows上的Node.js服务器,可以使用内网穿透工具,如ngrok或LocalTunnel。以下是使用ngrok的步骤和示例代码:

  1. 前往ngrok官网(https://ngrok.com/)并注册账户,或者使用Github账户登录。
  2. 下载并安装ngrok。
  3. 连接你的ngrok账户,打开命令行工具,输入ngrok authtoken <你的Auth Token>
  4. 启动内网穿透,执行ngrok http 80(如果Node.js服务器运行在80端口)。
  5. ngrok会提供一个公网地址,可以用来远程访问你的Node.js服务器。

示例代码(Node.js服务器):




const http = require('http');
 
const hostname = '127.0.0.1';
const port = 80; // 或者你的Node.js服务器监听的端口
 
const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});
 
server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

确保你的Node.js服务器正确运行,然后在另一台设备上通过ngrok提供的公网地址进行访问。

2024-08-17



# Node.js和npm简介
 
## Node.js是什么?
 
Node.js是一个开源和跨平台的JavaScript运行时环境。它在后端运行JavaScript代码,使得开发者可以用JavaScript编写服务器端应用程序。
 
## npm是什么?
 
npm是Node.js的包管理工具。它允许开发者分享和使用已经编写好的代码,称为包(package)或模块(module)。通过npm,开发者可以轻松安装、更新和管理项目所需的依赖。
 
## 安装Node.js和npm
 
访问[Node.js官网](https://nodejs.org/)并安装Node.js。安装过程中npm会一起被安装。
 
## 验证安装
 
打开终端(Terminal)或命令提示符(Command Prompt),输入以下命令来验证安装:
 
```bash
node -v
npm -v

这将显示安装的Node.js和npm的版本号。

使用npm安装包

要安装一个npm包,使用以下命令:




npm install package-name

package-name替换为你想要安装的包名。

更新npm包

更新npm包,使用以下命令:




npm update package-name

卸载npm包

卸载npm包,使用以下命令:




npm uninstall package-name

示例:安装Express框架

Express是Node.js的一个流行框架,可以用来快速创建Web应用。




npm install express

安装Express后,你可以在你的JavaScript文件中使用require('express')来引入并使用它。




const express = require('express');
const app = express();
 
app.get('/', (req, res) => {
  res.send('Hello World!');
});
 
app.listen(3000, () => {
  console.log('Server running on port 3000');
});

运行这段代码,将启动一个Web服务器,监听3000端口。当你访问http://localhost:3000/时,你会看到输出"Hello World!"。




node your-script-name.js

以上是Node.js和npm基础知识的简介以及安装过程,以及如何使用npm安装和管理包的示例。

2024-08-17

Node.js HTTP/2 CONTINUATION 拒绝服务漏洞(CVE-2024-27983) 是由于Node.js在处理HTTP/2协议中的连续帧时存在一个错误,攻击者可以通过构造特定的HTTP/2请求,使服务器无法正确处理这些请求,导致拒绝服务。

解决方法:

  1. 升级Node.js到安全版本:

    • 如果你使用的Node.js版本低于或等于v16.15.1、v17.10.1或v18.10.1,那么需要将Node.js升级到这些版本之后的一个修补版本。
    • 如果你使用的Node.js版本是v16.16.0、v17.11.0或v18.11.0,则不会受此漏洞影响,无需采取任何行动。
  2. 临时修补措施:

    • 如果不能立即升级,可以采取以下措施暂时防御此类攻击:

      • 对于使用http2模块的应用,可以在服务器端设置SETTINGS_MAX_HEADER_LIST_SIZE的值来限制请求头的大小。
      • 使用第三方的Node.js HTTP/2库,如http2-safe,它提供了一些安全特性。

请注意,在实施任何修补措施之前,应该与组织的安全团队沟通,确保所采取的措施不会影响到正常的服务需求。

2024-08-17

在Node.js中,fs模块用于文件操作,path模块用于处理路径,http模块用于HTTP服务器和客户端,而Node.js模块化遵循了ECMAScript模块标准的导出和导入。

fs模块




const fs = require('fs');
 
// 异步读取文件
fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});
 
// 同步读取文件
let data;
try {
  data = fs.readFileSync('example.txt', 'utf8');
  console.log(data);
} catch (err) {
  console.error(err);
}

path模块




const path = require('path');
 
const fullPath = path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
console.log(fullPath); // 输出: '/foo/bar/baz/asdf'

http模块




const http = require('http');
 
const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello World\n');
});
 
server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});

ECMAScript模块导出和导入




// 导出模块
// 文件名: math.js
export function add(a, b) {
  return a + b;
}
 
// 导入模块
// 另一个文件
import { add } from './math.js';
 
console.log(add(1, 2)); // 输出: 3

以上代码提供了使用Node.js中fs模块、path模块和http模块的基本示例,以及使用ECMAScript模块标准的导出和导入函数的方式。

2024-08-17

NPM是Node.js包管理器,它从npmjs.org获取包,并管理Node.js的应用程序的依赖关系和发布。

以下是NPM的一些常用命令:

  1. 安装npm:

    在Node.js官网下载安装包后,npm会自动安装。

  2. 更新npm:

    npm自身也是一个npm包,所以可以通过npm命令来更新npm。

    
    
    
    npm install -g npm@latest
  3. 使用npm安装包:

    
    
    
    npm install <package_name>

    例如,要安装express,可以运行:

    
    
    
    npm install express
  4. 全局安装包:

    
    
    
    npm install -g <package_name>
  5. 卸载包:

    
    
    
    npm uninstall <package_name>
  6. 更新包:

    
    
    
    npm update <package_name>
  7. 列出已安装的包:

    
    
    
    npm list
  8. 创建npm包:

    
    
    
    npm init

    这将引导你创建一个新的npm包,并生成一个package.json文件。

  9. 发布npm包:

    
    
    
    npm publish

    在发布前,请确保你的npm账户已经注册并登录。

  10. 删除发布的npm包:

由于npm没有提供一个直接的命令来删除发布的包,你需要在npm的网站上手动操作或者联系npm支持。

  1. 搜索npm包:

    
    
    
    npm search <package_name>
  2. 创建版本:

    npm使用语义版本控制,每个版本都遵循这样的格式:主版本号.次版本号.修订号

    
    
    
    npm version major  // 增加主版本号
    npm version minor  // 增加次版本号
    npm version patch  // 增加修订号
  3. 创建npm别名:

    你可以为包创建别名,这样你就可以用别名安装包而不是原始名称。

    
    
    
    npm link
  4. 使用npm脚本:

    npm可以在package.json文件中定义脚本,你可以通过npm run命令来运行这些脚本。

    
    
    
    npm run <script_name>
  5. 使用npm配置:

    
    
    
    npm config set <key> <value>

    例如,设置npm的默认注册表:

    
    
    
    npm config set registry https://registry.npmjs.org/
  6. 使用npm安装特定版本的包:

    
    
    
    npm install <package_name>@<version>

    例如,安装特定版本的express:

    
    
    
    npm install express@4.17.1
  7. 使用npm安装包的特定版本范围:

    
    
    
    npm install <package_name>@<version_range>

    例如,安装大于等于4.16.0小于5.0.0的express版本:

    
    
    
    npm install express@">=4.16.0 <5.0.0"
  8. 使用npm安装包的最新稳定版本:

    
    
    
    npm install <package_name>@latest
  9. 使用npm安装包的最新版本:

2024-08-17



// 引入必要的模块
const express = require('express');
const path = require('path');
const fs = require('fs');
const pdf = require('pdfkit');
 
// 创建Express应用
const app = express();
 
// 创建报表的路由处理
app.get('/create-report', (req, res) => {
    // 创建PDF文档
    const doc = new pdf();
 
    // 指定文件保存路径
    const filePath = path.join(__dirname, 'report.pdf');
 
    // 将文件写入流
    doc.pipe(fs.createWriteStream(filePath));
 
    // 添加文本到PDF文档
    doc.fontSize(25).text('报表示例', 100, 100);
 
    // 结束PDF文档写入
    doc.end();
 
    // 发送文件到客户端
    res.sendFile(filePath);
});
 
// 监听3000端口
app.listen(3000, () => {
    console.log('服务器运行在 http://localhost:3000/');
});

这段代码使用了Express框架和PDFKit库来创建并提供一个简单的PDF报表。当访问/create-report路径时,会生成一个包含文本“报表示例”的PDF文件,并将其发送到客户端。这个例子展示了如何在Node.js应用中使用DevExpress中文文档提到的技术来创建和提供报表服务。

2024-08-17

在Node.js中进行网络抓取,可以使用axiosrequest等库来发送HTTP请求,并用cheerio来解析返回的HTML内容。以下是一个简单的例子,使用axios获取网页内容,并用cheerio解析。

首先,你需要安装这些依赖:




npm install axios cheerio

然后,你可以使用以下代码进行网络抓取:




const axios = require('axios');
const cheerio = require('cheerio');
 
async function fetchAndParse(url) {
  try {
    // 发送GET请求
    const { data } = await axios.get(url);
    // 使用cheerio加载返回的HTML内容
    const $ = cheerio.load(data);
 
    // 示例:抓取页面上的所有链接
    const links = [];
    $('a').each((i, link) => {
      const href = $(link).attr('href');
      if (href) {
        links.push(href);
      }
    });
 
    // 输出抓取到的链接
    console.log(links);
 
  } catch (error) {
    console.error('Error fetching and parsing:', error);
  }
}
 
// 使用函数抓取一个网页
fetchAndParse('https://example.com');

这段代码定义了一个异步函数fetchAndParse,它接受一个URL,发送HTTP GET请求获取页面内容,然后使用cheerio加载并解析HTML。在解析后的DOM中,我们通过选择器抓取了所有的链接,并将它们输出到控制台。你可以根据实际需求修改选择器和后续处理逻辑。

2024-08-17

在Node.js中,可以使用nodemon这个工具来自动监控文件改动并重启服务器。以下是如何在你的Node.js项目中设置nodemon的步骤:

  1. 首先,你需要全局安装nodemon。在命令行中运行以下命令:

    
    
    
    npm install -g nodemon
  2. 在你的Node.js项目中,通过npm安装nodemon作为开发依赖:

    
    
    
    npm install --save-dev nodemon
  3. 接下来,修改你启动Node.js服务器的脚本,使其能够接受nodemon的参数。例如,如果你的启动命令是node app.js,你可以改为使用nodemon

    
    
    
    nodemon app.js
  4. nodemon的配置文件nodemon.json中,你可以指定需要监控的文件类型、忽略的文件、或者启动多个脚本等。

以下是一个简单的nodemon.json配置文件示例:




{
  "restartable": "rs",
  "ignore": [
    ".git",
    "node_modules/**/node_modules",
    "public/"
  ],
  "watch": [
    "./"
  ],
  "execMap": {
    "js": "node --harmony",
    "node": "node --harmony"
  },
  "events": [
    "restart"
  ],
  "logAt": {
    "start": true,
    "end": true,
    "crash": true
  }
}

在你的package.json中,你可以添加一个脚本来启动nodemon




"scripts": {
  "start": "nodemon app.js"
}

现在,每当你运行npm start时,nodemon会启动你的Node.js应用,并且在文件变动时自动重启服务器。

2024-08-17



// 引入Node.js内置的path模块
const path = require('path');
 
// 使用path模块的方法来操作文件路径
 
// 示例1: 连接路径
let basePath = '/home/user/documents';
let fileName = 'novel.txt';
let filePath = path.join(basePath, fileName);
console.log(filePath); // 输出: /home/user/documents/novel.txt
 
// 示例2: 解析文件扩展名
let fullPath = '/home/user/documents/novel.txt';
let extension = path.extname(fullPath);
console.log(extension); // 输出: .txt
 
// 示例3: 解析文件名
let file = 'home/user/documents/novel.txt';
let nameWithoutExtension = path.parse(file).name;
console.log(nameWithoutExtension); // 输出: novel
 
// 示例4: 转换路径字符串到全标准路径
let originalPath = 'home/user/./documents/../novel.txt';
let normalizedPath = path.normalize(originalPath);
console.log(normalizedPath); // 输出: home/user/novel.txt
 
// 示例5: 获取路径的目录名
let directoryPath = '/home/user/documents/novel.txt';
let dirname = path.dirname(directoryPath);
console.log(dirname); // 输出: /home/user/documents
 
// 示例6: 解析路径
let pathToParse = '/home/user/documents/novel.txt';
let parsedPath = path.parse(pathToParse);
console.log(parsedPath); // 输出: { root: '/', dir: '/home/user/documents', base: 'novel.txt', ext: '.txt', name: 'novel' }

这段代码展示了如何使用Node.js的path模块来处理文件路径。它包括了连接路径、获取文件扩展名、解析文件名、转换路径到全标准形式、获取路径的目录名以及解析路径。这些操作是文件处理和路径管理中常见的需求,使用path模块可以避免手动处理路径字符串时出现的各种问题。

2024-08-17

Node.js 的新特性 SEA(Server-Sent Events for API)和单文件可执行应用(Single-File Executable Applications,SFEA)目前并不是官方的特性,可能是某些第三方库或者社区提出的概念。

  1. Server-Sent Events for API (SEA)

    Server-Sent Events (SSE) 是一种服务器向浏览器推送数据的技术。在 Node.js 中,可以使用第三方库,如 server-sent-events 来实现 SSE 功能。

示例代码:




const sse = require('server-sent-events')
const stream = sse(request, response)
 
stream.send({ hello: 'world' })
stream.send({ another: 'event' })
stream.end()
  1. Single-File Executable Applications (SFEA)

    单文件可执行应用指的是将应用的所有代码打包进一个文件中,并给予这个文件执行权限,可以直接在命令行中运行。

对于 Node.js 应用,可以使用工具如 Webpack 的 Node Template 或者 Rollup 来创建单文件执行应用。

以 Webpack 为例的配置:




// webpack.config.js
module.exports = {
  // ...
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'app.js',
    libraryTarget: 'commonjs2'
  },
  target: 'node',
  // ...
};

然后在命令行中执行 webpack 打包命令,并给生成的 dist/app.js 文件添加执行权限:




chmod +x dist/app.js
./dist/app.js

以上是对 Node.js 新特性的一种理解和实现方式,具体的实现细节和特性可能会随着时间和 Node.js 社区的发展而变化。