Node.js 包参考指南
核心依赖
网络框架和服务器
-
特快 (^4.18.2)
- Web 应用程序框架
- 处理路由、中间件和 HTTP 请求/响应
- 构建 API 和 Web 应用程序的核心基础
数据库
-
猫鼬 (^7.0.0)
- MongoDB 对象建模工具
- 提供基于模式的解决方案来建模应用程序数据
- 处理数据库操作和关系
安全包
-
jsonwebtoken (^9.0.0)
- 创建并验证 JSON Web 令牌 (JWT)
- 用于用户身份验证和安全信息交换
-
bcryptjs (^2.4.3)
- 安全地散列和比较密码
- 保护数据库中的用户密码
-
头盔 (^6.0.1)
- 向 HTTP 响应添加安全标头
- 防止常见的网络漏洞
- 设置各种 HTTP 标头以确保安全
-
cors (^2.8.5)
- 实现跨源资源共享
- 控制哪些域可以访问您的 API
- 对于具有独立前端/后端的 Web 应用程序至关重要
验证和配置
-
joi (^17.9.0)
- 数据验证库
- 验证请求正文、查询参数和其他输入
- 确保数据完整性和格式
-
dotenv (^16.0.3)
- 从 .env 文件加载环境变量
- 管理配置设置
- 确保敏感数据的安全
开发依赖
开发工具
-
nodemon (^2.0.22)
- 监控开发过程中的文件更改
- 自动重启服务器
- 改进开发工作流程
使用示例
// Express server setup const express = require('express'); const app = express(); // Security middleware const helmet = require('helmet'); const cors = require('cors'); app.use(helmet()); app.use(cors()); // Environment variables require('dotenv').config(); // Database connection const mongoose = require('mongoose'); mongoose.connect(process.env.MONGODB_URI); // Validation example const Joi = require('joi'); const schema = Joi.object({ email: Joi.string().email().required() }); // Password hashing const bcrypt = require('bcryptjs'); const hashedPassword = await bcrypt.hash('password', 10); // JWT authentication const jwt = require('jsonwebtoken'); const token = jwt.sign({userId: 123}, process.env.JWT_SECRET);
完整的 Node.js 和 Mongoose 项目结构指南
项目结构
project-root/ ├── src/ │ ├── config/ │ │ ├── database.js │ │ └── config.js │ ├── models/ │ │ ├── user.model.js │ │ └── product.model.js │ ├── controllers/ │ │ ├── user.controller.js │ │ └── product.controller.js │ ├── routes/ │ │ ├── user.routes.js │ │ └── product.routes.js │ ├── middleware/ │ │ ├── auth.middleware.js │ │ └── error.middleware.js │ ├── utils/ │ │ ├── logger.js │ │ └── validators.js │ └── app.js ├── .env ├── .gitignore └── package.json
1. 初始设置
包.json
{ "name": "node-mongoose-project", "version": "1.0.0", "main": "src/app.js", "scripts": { "start": "node src/app.js", "dev": "nodemon src/app.js" }, "dependencies": { "express": "^4.18.2", "mongoose": "^7.0.0", "dotenv": "^16.0.3", "joi": "^17.9.0", "jsonwebtoken": "^9.0.0", "bcryptjs": "^2.4.3", "cors": "^2.8.5", "helmet": "^6.0.1" }, "devDependencies": { "nodemon": "^2.0.22" } }
.env
PORT=3000 MONGODB_URI=mongodb://localhost:27017/your-database JWT_SECRET=your-secret-key NODE_ENV=development
.gitignore
node_modules/ .env logs/ *.log
2. 配置设置
src/config/config.js
require('dotenv').config(); module.exports = { port: process.env.PORT || 3000, mongoUri: process.env.MONGODB_URI, jwtSecret: process.env.JWT_SECRET, nodeEnv: process.env.NODE_ENV || 'development', jwtExpiresIn: '1d' };
src/config/database.js
const mongoose = require('mongoose'); const config = require('./config'); const logger = require('../utils/logger'); const connectDB = async () => { try { await mongoose.connect(config.mongoUri, { useNewUrlParser: true, useUnifiedTopology: true }); logger.info('MongoDB connected successfully'); } catch (error) { logger.error('MongoDB connection error:', error); process.exit(1); } }; module.exports = connectDB;
3. 模型定义
src/models/user.model.js
const mongoose = require('mongoose'); const bcrypt = require('bcryptjs'); const jwt = require('jsonwebtoken'); const config = require('../config/config'); const userSchema = new mongoose.Schema({ name: { type: String, required: [true, 'Name is required'], trim: true, minlength: 3, maxlength: 50 }, email: { type: String, required: [true, 'Email is required'], unique: true, lowercase: true, trim: true }, password: { type: String, required: [true, 'Password is required'], minlength: 6, select: false }, role: { type: String, enum: ['user', 'admin'], default: 'user' } }, { timestamps: true }); // Pre-save middleware to hash password userSchema.pre('save', async function(next) { if (!this.isModified('password')) return next(); this.password = await bcrypt.hash(this.password, 12); next(); }); // Instance methods userSchema.methods.generateAuthToken = function() { return jwt.sign( { id: this._id, role: this.role }, config.jwtSecret, { expiresIn: config.jwtExpiresIn } ); }; userSchema.methods.comparePassword = async function(candidatePassword) { return await bcrypt.compare(candidatePassword, this.password); }; const User = mongoose.model('User', userSchema); module.exports = User;
src/models/product.model.js
const mongoose = require('mongoose'); const productSchema = new mongoose.Schema({ name: { type: String, required: true, trim: true }, price: { type: Number, required: true, min: 0 }, description: String, category: { type: String, required: true }, createdBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true } }, { timestamps: true }); const Product = mongoose.model('Product', productSchema); module.exports = Product;
4. 控制器
src/controllers/user.controller.js
const User = require('../models/user.model'); const { validateUser } = require('../utils/validators'); const logger = require('../utils/logger'); exports.register = async (req, res) => { try { const { error } = validateUser(req.body); if (error) return res.status(400).json({ error: error.details[0].message }); const user = await User.create(req.body); const token = user.generateAuthToken(); res.status(201).json({ status: 'success', token, data: { user } }); } catch (error) { logger.error('Registration error:', error); res.status(400).json({ status: 'fail', message: error.message }); } }; exports.login = async (req, res) => { try { const { email, password } = req.body; const user = await User.findOne({ email }).select('+password'); if (!user || !(await user.comparePassword(password))) { return res.status(401).json({ status: 'fail', message: 'Invalid email or password' }); } const token = user.generateAuthToken(); res.json({ status: 'success', token }); } catch (error) { logger.error('Login error:', error); res.status(400).json({ status: 'fail', message: error.message }); } };
5. 路线
src/routes/user.routes.js
const express = require('express'); const router = express.Router(); const userController = require('../controllers/user.controller'); const auth = require('../middleware/auth.middleware'); router.post('/register', userController.register); router.post('/login', userController.login); router.get('/profile', auth, userController.getProfile); module.exports = router;
6. 中间件
src/middleware/auth.middleware.js
const jwt = require('jsonwebtoken'); const config = require('../config/config'); const User = require('../models/user.model'); module.exports = async (req, res, next) => { try { const token = req.headers.authorization?.replace('Bearer ', ''); if (!token) { return res.status(401).json({ status: 'fail', message: 'No token provided' }); } const decoded = jwt.verify(token, config.jwtSecret); const user = await User.findById(decoded.id); if (!user) { return res.status(401).json({ status: 'fail', message: 'User not found' }); } req.user = user; next(); } catch (error) { res.status(401).json({ status: 'fail', message: 'Invalid token' }); } };
src/middleware/error.middleware.js
const logger = require('../utils/logger'); module.exports = (err, req, res, next) => { logger.error(err.stack); if (err.name === 'ValidationError') { return res.status(400).json({ status: 'fail', message: err.message }); } if (err.code === 11000) { return res.status(400).json({ status: 'fail', message: 'Duplicate field value' }); } res.status(err.status || 500).json({ status: 'error', message: err.message || 'Internal server error' }); };
7. 实用工具
src/utils/logger.js
const winston = require('winston'); const config = require('../config/config'); const logger = winston.createLogger({ level: config.nodeEnv === 'development' ? 'debug' : 'info', format: winston.format.combine( winston.format.timestamp(), winston.format.json() ), transports: [ new winston.transports.File({ filename: 'logs/error.log', level: 'error' }), new winston.transports.File({ filename: 'logs/combined.log' }) ] }); if (config.nodeEnv === 'development') { logger.add(new winston.transports.Console({ format: winston.format.simple() })); } module.exports = logger;
src/utils/validators.js
const Joi = require('joi'); exports.validateUser = (user) => { const schema = Joi.object({ name: Joi.string().min(3).max(50).required(), email: Joi.string().email().required(), password: Joi.string().min(6).required(), role: Joi.string().valid('user', 'admin') }); return schema.validate(user); }; exports.validateProduct = (product) => { const schema = Joi.object({ name: Joi.string().required(), price: Joi.number().min(0).required(), description: Joi.string(), category: Joi.string().required() }); return schema.validate(product); };
8. 主要申请文件
src/app.js
const express = require('express'); const cors = require('cors'); const helmet = require('helmet'); const config = require('./config/config'); const connectDB = require('./config/database'); const errorMiddleware = require('./middleware/error.middleware'); const userRoutes = require('./routes/user.routes'); const productRoutes = require('./routes/product.routes'); const logger = require('./utils/logger'); // Initialize express app const app = express(); // Connect to MongoDB connectDB(); // Middleware app.use(helmet()); app.use(cors()); app.use(express.json()); app.use(express.urlencoded({ extended: true })); // Routes app.use('/api/users', userRoutes); app.use('/api/products', productRoutes); // Error handling app.use(errorMiddleware); // Start server app.listen(config.port, () => { logger.info(`Server running in ${config.nodeEnv} mode on port ${config.port}`); }); // Handle unhandled promise rejections process.on('unhandledRejection', (err) => { logger.error('UNHANDLED REJECTION! Shutting down...'); logger.error(err.name, err.message); process.exit(1); });
运行应用程序
- 安装依赖项:
npm install
在 .env 中设置环境变量
启动开发服务器:
npm run dev
- 用于生产:
npm start
测试 API
使用Postman或curl等工具测试API端点:
# Register a new user curl -X POST http://localhost:3000/api/users/register \ -H "Content-Type: application/json" \ -d '{"name": "John Doe", "email": "john@example.com", "password": "password123"}' # Login curl -X POST http://localhost:3000/api/users/login \ -H "Content-Type: application/json" \ -d '{"email": "john@example.com", "password": "password123"}'
这份结构化指南为 Node.js 和 Mongoose 应用程序提供了完整的设置,并具有适当的组织、错误处理和安全功能。每个文件都有其特定的职责,使代码库可维护和可扩展。
以上是Nodejs 中使用 mongodb 数据库进行安全身份验证。的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript在现实世界中的应用包括服务器端编程、移动应用开发和物联网控制:1.通过Node.js实现服务器端编程,适用于高并发请求处理。2.通过ReactNative进行移动应用开发,支持跨平台部署。3.通过Johnny-Five库用于物联网设备控制,适用于硬件交互。

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

记事本++7.3.1
好用且免费的代码编辑器