nodejs
Node.js
Node.js基础
Node.js不是一门语言,也不是 JavaScript 的框架,也不是像Nginx一样的Web服务器 ,Node.js 是 JavaScript 在服务器端的运行环境(平台),运行在 Chrome 的 V8 引擎上。在前端写 JS 是用于控制浏览器;而 Node.js 环境写 JS 可以控制整个计算机。
Node.js 的组成
- ECMAScript:ECMAScript 的所有语法在 Node 环境中都可以使用。
- Node 环境提供的一些附加 API(包括文件、网络等相关的 API)。而JS里的API是浏览器端提供的 DOM 和 BOM,Node.js 没有
npm:Node.js 的包管理工具
nvm常用命令
使用nvm下载Node.js,在cmd中输入
nvm -v
查看已安装的 nvm 版本
nvm install 版本号
下载指定版本的node.js
nvm uninstall 版本号
卸载指定版本的node.js
nvm use 版本号
切换使用指定版本的node.js
nvm alias default 版本号
设置node.js的默认版本
nvm ls
查看已安装的所有 node 版本
Node.js 的常用命令
node -v
查看正在使用的 node 的版本
node -e 'console.log("Hello World")'
执行脚本字符串
node 01.js
运行脚本文件
node --help
查看帮助
node
进入 REPL 环境,类似于浏览器的控制台
.exit 或 process.exit()
退出 REPL 环境
npm常用命令
npm -v
查看当前npm版本
npm install npm@latest -g
更新 npm
npm init --yes
项目初始化(执行完成后,会生成package.json文件),加了yes快速跳过问答式界面,选择默认配置
npm install [package]
在当前工程下安装指定的包
npm install -g [package]
在全局安装指定的包
npm install [package] -D
安装的包只用于开发环境,不用于生产环境(会出现在 package.json 文件中的 devDependencies 属性中)
npm install [package] -S
安装的包需要发布到生产环境(会出现在 package.json 文件中的 dependencies 属性中)
npm list
查看当前目录下已安装的 node 包
npm list -g
查看全局已经安装的 node 包
npm ls express
查看该项目安装的express版本
npm ls express -g
查看全局安装的express版本
npm --help
查看 npm 帮助
npm [指定命令] --help
查看指定命令的帮助
npm update [package]
更新指定的包
npm uninstall [package]
卸载指定的包
用 nrm 切换和管理 npm 包的镜像源
npm install -g nrm
全局下载nrm包
nrm ls
显示全部的镜像
nrm use taobao
使用淘宝的镜像
模块
导入模块
exports对象用来导出当前模块的公共方法或属性。别的模块通过 require 函数调用当前模块时,得到的就是当前模块的 exports 对象。
/* 暴露模块的方式 */
exports.name = name //方式一,就相当于给exports添加属性
module.export.foo = foo //方式二,也是添加属性,但这个和方式一的区别是可以赋值给整个module.exports,如 module.exports = obj。而exports不行,但最后exports = module.exports这个都会赋值给exports
/* commonJS */
//nodejs用commonJS,webpack底层是nodejs所以也用这种方式导入导出
//导出
module.exports = {flag,test} //可以写定义好的变量名、函数名之类,也可以写一个包含变量函数的对象赋给module.exports
//导入
//导入时,第三方模块要放在自定义模块的上面
var {flag,test} = require("./aaa") //等价于_aaa= require("./aaa") ,flag=_aaa.flag这种写法
const module1 = require('./main.js')
module1.foo() //运行main.js里的foo函数,多次引用模块,只会初始化一次,即a++这种会累加
/* ES6 */
//vue用ES6
//1. 导出
export {name,age,sex} //可定义好的变量名、函数名等;或写成对象形式导出
//1. 导入
import {name,age,sex,say,Person} from './aaa.js' //导入多个变量、函数、类
//2. 导出 export default
export default {name,age,sex} //一个文件中,只能有一个。会将所有需要导出的变量打包成一个对象,导入时可自定义这个对象名(如定义成aaa),那么在另一个文件中调用时,需要使用aaa.变量
//2. 导入 export default
import aaa from './aaa.js'
//3.在html文件中导入
<script src="aaa.js" type="module"></script>
//4. 全部导入
import * as aaa from './aaa.js' //aaa为自定义
webpack
webpack是一个JavaScript应用的静态模块打包工具
模块化:webpack可以支持前端模块化的一些方案,例如AMD、CMD、CommonJS、ES6。可以处理模块之间的依赖关系。不仅仅是js文件可以模块化,图片、css、json文件等等都可以模块化。
打包:webpack可以将模块资源打包成一个或者多个包,并且在打包过程中可以处理资源,例如压缩图片,将scss转成css,ES6语法转成ES5语法,将TypeScript转成JavaScript等等操作。grunt/gulp也可以打包。
express
express框架创建web服务
npm install express-generator -g
全局安装express生成器express 项目名称
创建项目- 进入项目目录下
cd 项目名
,执行npm install
,会根据package.json,自动下载安装所需的模块 npm start
运行项目- 浏览器输入
localhost:3000
看能不能访问成功
在别的项目里添加后端服务器,可以先创建server文件夹,里面写好如下的index.js文件,用npm init -y
项目初始化,生成package.json文件,在该文件里添加用到的包,然后npm install
下载包,再nodemon index.js
启动后端服务器
// server/index.js
//引入express,用commonJS方式引入
const express = require("express");
const app = express(); //生成express对象app
const port = 3000 // 默认3000
//设置跨域请求
app.all('*', function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By", ' 3.2.1')
res.header("Content-Type", "application/json;charset=utf-8");
next();
});
//express拓展了HTTP模块中的请求和响应对象,请求对象继承自 http.IncomingMessage,响应对象继承自 http.ServerResponse
app.get("/", (req, res) => {
//nodejs的原生方法
res.write('a') //发送数据
res.end() //结束响应。用原生方法的话都是要写这句的。或者用res.end('hello')发送数据的同时,结束响应
//express的扩展方法
console.log(req.query) //获取请求参数params
res.cookie('name', 'bar') //会变成键值对,第一个是key,第二个是value
res.send({name:'bar'}) //send会自动结束响应,所以要写在最后。send还可以发送对象,但其实会被转成json格式。
res.status(200).send('OK')
}); //客户端向本服务器发送get请求时调用这个处理函数。在根路径响应get请求。req是请求对象,可获取请求内容,res是响应对象,可以给客户端发送响应内容
app.get("/todos/:id", (req, res) => { //客户端向服务器发送 比如http://xxxxxx/todos/2 请求时,执行这个函数,返回id是2的数据
fs.readFile("./db.json", "utf8", (err, data) => {
if (err) {
return res.status(500).json({
error: err.message,
});
}
const db = JSON.parse(data); //先把json数据解码成js对象才能执行js方法
const x = db.find( item => item.id === +req.params.id);
if (!x) {
return res.status(404).end();
}
res.status(200).json(x);
});
});
app.post('/user', (req, res) => {
res.send('Got a POST request')
}) //响应对/user路径的post请求
//为了启动服务,设置监听端口号。在该文件的文件夹下,执行node xxx.js 检测是否启动成功。用nodemon xxx.js 启动程序,可检测文件变化,自动更新程序
app.listen(3000, () => {
console.log(`Server running at http://localhost:${port}/`);
});
express教程(笔记有四部分的,这个链接只是一部分):https://juejin.cn/post/7022539322670710798#heading-4
https://www.bilibili.com/video/BV1mQ4y1C7Cn?p=5
postman使用:https://www.cnblogs.com/hekeweivip/p/15342786.html
跨域问题:https://blog.csdn.net/LPLIFE/article/details/89432768
fs文件处理模块
/* 读取文件 */
const fs = require('fs'); //导入文件处理模块
//异步读取文件
fs.readFile('hello.txt', { flag: 'r', encoding: "utf-8" }, (err, data) => {
if (err) {
console.log(err)
} else {
console.log('异步读取数据:' + data)
}
});
//需层层调用的,如获取到a了,才能继续获取b之类的
//方式一:promise封装异步读取文件
//方式二:async...await封装异步读取文件
//同步读取文件
try { //异常处理必须使用 try...catch 方式
const data = fs.readFileSync('hello.txt', 'utf8');
console.log(data);
} catch(e) {// 文件不存在,或者权限错误
throw e;
}
/* 读取目录 */
fs.readdir("/tmp/",function(err, files){
if (err) {
return console.error(err);
}
files.forEach( function (file){
console.log( file );
});
});
/* 写入文件 */
fs.writeFile('3.html', "<h1>永不止步</h1>", { flag: "a", encoding: "utf-8" }, (err) => {
if (err) {
console.log(err)
} else {
console.log('成功')
}
});
/* 删除文件 */
fs.unlink('path/file.txt', (err) => {
if (err) throw err;
console.log('文件删除成功');
});
/* 删除目录 */
fs.rmdir()('path/file', (err) => {
if (err) throw err;
console.log('文件删除成功');
});
path路径模块
const path = require('path') //导入path模块
/* 获取文件扩展名 */
path.extname('.index.md')
/* 路径生成 */
let arr2 = ['/foo1/foo2', '/qianguyihao', 'foo3'];
let result2 = path.resolve(...arr2) //从右往左识别到开头是/的元素停下,返回路径。打印结果:/qianguyihao/foo3
console.log(__dirname) //前执行文件所在完整目录
console.log(__filename)//当前执行文件的完整目录 + 文件名
console.log(process.cwd())//获取当前执行 Node命令 时的目录名
path.join('/foo1', 'foo2', './foo3') //拼接路径。它会自动规范化。这个返回的就是 /foo1/foo2/foo3
mysql模块
let mysql = require("mysql") //引入 mysql 包
/* 连接数据库 */
let options = {
host: "localhost",
port:"3306", //3306或3308
user: "root",
password: '511830',
database: "test",
};
//创建与数据库进行连接的连接对象
let connection = mysql.createConnection(options);
//建立连接
connection.connect((err) => {
if (err) {
console.log(err);
} else {
console.log("数据库连接成功");
}
});
/* 查询 */
let strSql1 = `select *
from qiangu_student_table`
connection.query(strSql1, (err, result, fields) => {
if (err) {
console.log(err);
} else {
console.log(JSON.stringify(result)) //返回sql查询内容
console.log(JSON.stringify(fields)) //返回表结构
}
})
/* 插入数据是变量 */
const strSql7 = "insert into qianguyihao_table5 (name, age) values (?, ?)";
connection.query(strSql7, ['许嵩', '34'], (err, result) => {
if (err) {
console.log(err);
} else {
console.log('插入数据成功:' + JSON.stringify(result));
}
});
其他模块
/* Buffer */
//通过 Buffer 开辟的内存空间,都是连续的内存空间,效率比较高
let buffer = Buffer.from(str) //将字符串转成 buffer 对象
console.log(buffer.toString()) //输出字符串
let buffer = Buffer.alloc(20) //从内存中开辟一个新的缓冲区
buffer[0] = 'a'
/* os模块 */
os.networkInterfaces() //查看网络地址
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY