当前位置: 首页 > news >正文

Node.js 编码规范

Node.js 编码规范

一、编码风格

1. 全局变量使用

直接使用 Node.js 内置的全局变量,无需通过 require 引入:

// 不推荐
const { Buffer } = require('buffer');
const b = Buffer.alloc(16);// 推荐
const b = Buffer.alloc(16);

适用于 Buffer、URL、URLSearchParams、TextEncoder、TextDecoder、process、console 等全局对象。

2. 优先使用 Promise API

推荐使用模块的 promises API 替代回调方式:

// 不推荐
const fs = require('fs');
fs.readFile(filePath, 'utf8', (error, content) => { ... });// 推荐
const { promises: fs } = require('fs');
async function readData(filePath) {const content = await fs.readFile(filePath, 'utf8');
}

3. 模块引用顺序

模块引用应遵循以下顺序:

  1. Node 内置模块
  2. npm 包
  3. 本地文件

同类引用按字典序排列,不同类别间空一行分隔:

// 推荐
const fs = require('fs');
const http = require('http');const { Bar, Foo } = require('tool');
const moment = require('moment');const Car = require('./models/car');

4. 异常处理规范

必须使用原生 Error 对象抛出异常:

// 不推荐
throw 'error';
throw 0;// 推荐
throw new Error('error');
const err = new Error('error');
throw err;

5. 避免同步方法

线上环境应避免使用同步方法:

// 不推荐
fs.readFileSync('./somefile', 'utf-8');// 推荐
const { promises: fs } = require('fs');
async function test() {await fs.readFile('./somefile', 'utf-8');
}

二、安全规范

  1. 隐藏错误详情:客户端错误提示不得包含敏感系统信息
  2. 隐藏技术栈标识:移除或伪造 X-Powered-By 响应头
  3. JSONP 安全:跨域接口需严格校验访问来源,配置域名白名单
  4. 用户标识安全:禁止使用参数或明文 cookie 中的用户标识查询敏感信息
  5. 防止 SQL 注入:使用预编译语句,对用户输入进行转义和过滤
  6. 依赖管理:定期检查并更新存在漏洞或过期的依赖
  7. 文件上传安全:用户上传文件应存储至 OSS 等专业服务
  8. URL 重定向安全:服务端重定向需设置白名单验证
  9. 接口入参校验:使用 jsonschema 或 joi 严格校验请求参数

三、最佳实践

  1. 无状态设计:应用应保持无状态,使用外部存储管理数据
  2. 静态文件托管:推荐使用 CDN 而非 Node.js 托管前端静态文件
  3. CPU 密集型任务:将 CPU 密集型任务委托给反向代理(如 nginx)
  4. 异步编程:优先使用 async/await 替代回调函数
  5. 回调函数处理:使用 util.promisify 将回调转为 Promise:
const util = require('util');
const fs = require('fs');
const stat = util.promisify(fs.stat);
  1. Promise 使用:优先使用原生 Promise 而非第三方库
  2. 链式调用:类方法返回 this 实现链式调用:
class Jedi {jump() {this.jumping = true;return this;}setHeight(height) {this.height = height;return this;}
}

本规范基于 eslint-config-egg 扩展,旨在提升 Node.js 业务开发的代码一致性、安全性和可维护性。


文章转载自:

http://fmlDEUbf.frpfk.cn
http://wBEquffM.frpfk.cn
http://hDfSg77A.frpfk.cn
http://hYwjHhvA.frpfk.cn
http://6Khd2Ymy.frpfk.cn
http://bBjfXjK9.frpfk.cn
http://Dl2npntJ.frpfk.cn
http://ApEouGQX.frpfk.cn
http://tUBnxuYx.frpfk.cn
http://svGhXqP6.frpfk.cn
http://W4U2oImQ.frpfk.cn
http://wlpbXDND.frpfk.cn
http://ebDIv36k.frpfk.cn
http://KtUzqf3S.frpfk.cn
http://4Zz5wMH2.frpfk.cn
http://gwHX7gQ8.frpfk.cn
http://rRM4Fns8.frpfk.cn
http://ipCENvBX.frpfk.cn
http://Ve0g3xC2.frpfk.cn
http://Pz5aUok5.frpfk.cn
http://p3Psg8ru.frpfk.cn
http://FKw6rW7r.frpfk.cn
http://5yzbZDqQ.frpfk.cn
http://wRJF3QQT.frpfk.cn
http://hoJKskFB.frpfk.cn
http://7iSuogdp.frpfk.cn
http://c8m8WvAL.frpfk.cn
http://eYoIT7KB.frpfk.cn
http://6TEkKFCL.frpfk.cn
http://vWW1ZaLe.frpfk.cn
http://www.dtcms.com/a/382714.html

相关文章:

  • Spring Boot 调度任务在分布式环境下的坑:任务重复执行与一致性保证
  • 【数据结构】 ArrayList深入解析
  • 4. 数系
  • 08 函数式编程
  • 安卓 Google Maps 的使用和开发步骤
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十三章知识点问答(15题)
  • 深入理解 Spring @Async 注解:原理、实现与实践
  • 【Qt开发】显示类控件(三)-> QProgressBar
  • 《Linux——gflags》
  • leetcode35.搜索插入位置
  • Java调用UniHttp接口请求失败?一次开源的深入实践-百度SN签名认证场景下参数乱序问题的三种解决策略
  • MongoDB 监控
  • 【Linux】system V共享内存
  • --- 统一请求入口 Gateway ---
  • 豆包Seedream 4.0多图融合实力派:田园犬+三花猫多场景创作,AI绘画新时代来了!
  • 贪心算法应用:数据包调度问题详解
  • html基本知识
  • 视觉SLAM第10讲:后端2(滑动窗口与位子图优化)
  • Modbus协议原理与Go语言实现详解
  • 模型部署|将自己训练的yolov8模型在rk3568上部署
  • Vue中的slot标签——插槽
  • k8s集群—node节点的删除与添加
  • k8s的dashboard
  • k8s-容器探针和生命周期回调学习
  • 跟上大数据时代步伐:食物营养数据可视化分析系统技术前沿解析
  • 大数据毕业设计选题推荐-基于大数据的结核病数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • 全网首发! Nvidia Jetson Thor 128GB DK 刷机与测评(三)常用功能测评 DeepAnything 系列
  • Python快速入门专业版(二十六):Python函数基础:定义、调用与返回值(Hello函数案例)
  • 【系列文章】Linux中的并发与竞争[03]-自旋锁
  • Web前端面试题(1)