2024-08-17

在Node.js后端使用Express框架和MySQL数据库,Vue3前端实现登录功能的基本步骤如下:

后端(Node.js + Express):

  1. 安装所需依赖:express, mysql, cors, body-parser
  2. 创建Express服务器并设置CORS。
  3. 连接MySQL数据库。
  4. 创建登录路由,验证用户凭据。

前端(Vue3):

  1. 创建Vue项目。
  2. 设计登录表单。
  3. 使用axios发送登录请求。
  4. 处理登录结果(例如保存token)。

以下是简化的代码示例:

后端 (server.js):




const express = require('express');
const mysql = require('mysql');
const cors = require('cors');
const bodyParser = require('body-parser');
 
const app = express();
const db = mysql.createConnection({
  // MySQL连接配置
});
 
app.use(cors());
app.use(bodyParser.json());
 
// 连接数据库
db.connect(err => {
  if (err) throw err;
  console.log('Connected to MySQL database.');
});
 
// 登录路由
app.post('/login', (req, res) => {
  const { username, password } = req.body;
  db.query(
    'SELECT * FROM users WHERE username = ? AND password = ?',
    [username, password],
    (error, results) => {
      if (error) throw error;
      if (results.length > 0) {
        // 登录成功,返回成功响应
        res.status(200).send('Logged in successfully.');
      } else {
        // 登录失败,返回错误响应
        res.status(401).send('Invalid username or password.');
      }
    }
  );
});
 
app.listen(3000, () => {
  console.log('Server is running on port 3000.');
});

前端 (Login.vue):




<template>
  <div>
    <input type="text" v-model="username" placeholder="Username" />
    <input type="password" v-model="password" placeholder="Password" />
    <button @click="login">Login</button>
  </div>
</template>
 
<script>
import axios from 'axios';
 
export default {
  data() {
    return {
      username: '',
      password: ''
    };
  },
  methods: {
    async login() {
      try {
        const response = await axios.post('http://localhost:3000/login', {
          username: this.username,
          password: this.password
        });
        console.log(response.data);
        // 处理登录成功的情况,例如保存token或跳转页面
      } catch (error) {
        console.error(error);
        // 处理登录失败的情况
      }
    }
  }
};
</script>

确保在启动前端应用之前启动后端服务器,并在发送请求时确保服务器端口是开放的。这只是一个简单的示例,实际应用中需要考虑更多安全性问题,比如使用加密存储密码、返回合适的HTTP状态码、处理session和token管理等。

2024-08-17



// 引入Node.js文件系统模块
const fs = require('fs');
 
// 异步读取文件内容
fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});
 
// 同步读取文件内容
try {
  const data = fs.readFileSync('example.txt', 'utf8');
  console.log(data);
} catch (err) {
  console.error(err);
}
 
// 异步写入文件内容
fs.writeFile('example.txt', 'Hello, Node.js!', 'utf8', (err) => {
  if (err) throw err;
  console.log('文件已被写入');
});
 
// 同步写入文件内容
try {
  fs.writeFileSync('example.txt', 'Hello, Node.js!', 'utf8');
  console.log('文件已被写入');
} catch (err) {
  console.error(err);
}
 
// 异步追加文件内容
fs.appendFile('example.txt', ' Additional content', 'utf8', (err) => {
  if (err) throw err;
  console.log('内容已追加到文件');
});
 
// 同步追加文件内容
try {
  fs.appendFileSync('example.txt', ' Additional content', 'utf8');
  console.log('内容已追加到文件');
} catch (err) {
  console.error(err);
}

这段代码展示了如何在Node.js中使用文件系统模块(fs)进行常见的文件操作,包括异步和同步方法。每个操作都有错误处理,并且在文件操作完成后给出反馈。这是学习Node.js文件操作的一个很好的起点。

2024-08-17



# 更新系统包索引
sudo apt-get update
 
# 安装Node.js
sudo apt-get install -y nodejs
 
# 安装npm(Node.js的包管理器)
sudo apt-get install -y npm
 
# 使用npm安装Express.js
npm install express --save
 
# 创建一个简单的Express.js HTTP服务器
touch app.js
 
# 编辑app.js文件,并添加以下内容



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



# 运行你的Express.js应用
node app.js

以上命令和代码展示了如何在Linux环境下安装Node.js和Express.js,并创建一个简单的HTTP服务器。这个HTTP服务器监听3000端口,并对根URL (/) 的GET请求回应 'Hello World!'。

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中,我们通过选择器抓取了所有的链接,并将它们输出到控制台。你可以根据实际需求修改选择器和后续处理逻辑。