安装下载

http://nodejs.cn/download/

服务器安装node
/opt/tools/node/bin/node是解压后node的文件夹
ln -s /opt/tools/node/bin/node /bin/node
ln -s /opt/tools/node/bin/npm /bin/npm

命令

查看npm下载的地方
npm root -g

查看本地npm下载镜像
npm config get registry

修改镜像源
npm config set registry https://registry.npm.taobao.org

下载脚手架
//Mac vue脚手架 必须加-g -g是全局 sudo是权限
//windows 去掉sudo
sudo npm install @vue/cli -g

卸载脚手架
//Mac卸载脚手架 npm uninstall -g 脚手架名
//windows 去掉sudo
sudo npm uninstall -g express

Mac文件夹授权
sudo chmod 777 文件名

运行文件
//找到文件的地方
node 文件名

vscode运行nodejs

image

文件系统模块

//文件系统

var fs=require('fs');

//读取文件 UTF-8 不加读出来的是二进制需要toString()
fs.readFile('nodeday1.js','utf-8',function(err,data){
if(err){
console.log("读取失败!");
return;
}
console.log(data);
//console.log(data.toString());
})

//写文件
const fh="nh1 jksak1 大家好\n碎觉觉把就"
fs.writeFile("a1.txt",fh,err=>{
if(err){
console.log("写入错误!");
return;
}
console.log("写入成功!");
})

操作系统模块

//操作系统模块
var os=require('os');
//os.EOL换行
console.log("hello"+os.EOL+"njk");
//获取主机名
console.log("主机名:"+os.hostname());
//系统
console.log("系统:"+os.type());
//cpu
console.log("CUP:"+os.cpus());
//内存
console.log("内存:"+os.totalmem);

路径模块

//路径模块
var path=require('path');

var cf="/usr/local/lib/node_modules/01.jpg";
//获取文件名
var name=path.basename(cf);
//获取目录名
var dirname=path.dirname(cf);
//返回扩展名
var fkzm=path.extname(cf);
//拼接路径
var paok=path.format({
dir:'/usr/local/lib/node_modules',
base:'hello.png'
})

//路径拆开成对象
var padx=path.parse(cf);
console.log(name);
console.log(dirname);
console.log(fkzm);
console.log(paok);
console.log(padx);

url模块

//URL模块
var url=require('url');
var path="www.baidu.com?name=temo&pass=123456";
//拆开网址
var t1=url.parse(path,true);
console.log(t1);
console.log(t1.query.name);
console.log(t1.query.pass);

自定义模块

function add(){
console.log("这是添加的方法!");
}

function del(){
console.log("这是删除!");
}

//exports.a=add //调用试就是a();
exports.add=add;
exports.del=del;

//使用
//自定义模块测试
var fx=require("./fun");
fx.add();

当服务器使用

//活的端口 和 sever01有不同的返回
var http=require("http");
var fs=require("fs");
var port=8070;

var wrtvalu="";
var server=http.createServer((req,res)=>{
if(req.url=="/"){
wrtvalu="这是首页!";
}else if(req.url=="/login"){
wrtvalu="这是登录!";
}else{
wrtvalu="这是404!";
}
fs.writeFile("a1.txt",wrtvalu,err=>{
if(err){
console.log("写入错误!");
return;
}
console.log("写入成功!");
})

fs.readFile('a1.txt','utf-8',function(err,data){
if(err){
console.log("读取失败!");
return;
}
console.log(data);
res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});
res.write(data);
})
// res.end();
})
server.listen(port);

新的自定义模块导出

/**
*
*
* 自定义模块
*/

function add(){
console.log("这是添加方法!");
}

function del(){
console.log("这是删除方法!");
}
//新的导出方式
export default{
add:add,
del:del
}

使用

方法1

//新创建一个JS
import fun from './fun.js'

console.log(fun);

界面使用 src="上面JS的文件"
<script src="测试自定义模块fun2.js" type="module"></script>

方法2

//不需要创建JS
<script type="module">
import fun from "./fun.js";
console.log(fun);
</script>

项目npm使用

//到项目文件下初始化
npm init -y
//开启自动更新 热部署
npm i nodemon --save-dev
//运行JS nodemon 文件名 control+c停掉
nodemon index.js
//删除项目的node_modules后 可以重写下载
npm install

//日期模块
npm install moment

//全局
-g
//save-dev 添加到开发环境
npm i nodemon --save-dev
// 添加到生产环境 默认生产
npm install 名字

开发依赖 devDependencies
生产依赖 dependencies

//简化命令时的文件名长度
在package.json 找到scripts
"名字""node 文件名";
简化后运行 npm run 名字 // npm run a

1、搭建服务器 npm install express
2、模板引擎 npm install art-template
npm install express-art-template

image

npm路由

需要创建一个public文件夹 存放静态资源
需要创建一个view文件夹 存放视图 界面
项目文件夹下执行
1、搭建服务器 npm install express
2、模板引擎 npm install art-template
npm install express-art-template

响应方式

end() 响应字符串(乱码)
send() 响应字符串(自动识别)
render() 响应字符串(自动识别,只能打开指定字符串并响应:须与模板引擎配合)

路由示例1

发送内容到界面

//引入模块
var express=require("express");
//服务器
var app=express();
//路由 首页
app.get('/',function(req,res){
//res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});
//res.end("哥哥来抓我呀!\t<a href='www.baidu.com'>百度</a>");
res.send("哥哥来抓我呀!\t<a href='www.baidu.com'>百度</a>");
});
//启动服务器
app.listen(8090,()=>{
console.log("服务器开启 http://127.0.0.1:8090/");
});

路由示例2

返回界面

//引入模块
var express=require("express");
//服务器
var app=express();
//引擎模板
app.engine('html',require('express-art-template'));
//路由 首页
app.get('/',function(req,res){
//res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});
//res.end("哥哥来抓我呀!\t<a href='www.baidu.com'>百度</a>");
//res.send("哥哥来抓我呀!\t<a href='www.baidu.com'>百度</a>");
res.render('index.html',{
sname:'展示干',
sage:19,
orders:[
{id:1,title:'标题1',price:50},
{id:2,title:'标题2',price:80},
{id:3,title:'标题3',price:100},
]
});
//启动服务器
app.listen(8090,()=>{
console.log("服务器开启 http://127.0.0.1:8090/");
})

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>首页</h1>
<h1>姓名{{sname}}</h1>
<h1>年龄{{sage}}</h1>
{{if sage> 18}}
<h1>妹妹 哥哥来了!</h1>
{{else}}
<h1>未成年</h1>
{{/if}}
<table border="1px" style="width: 25%;text-align: center;" cellspacing="0px">
<tr>
<td>下标</td>
<td>ID</td>
<td>标题</td>
<td>价格</td>
</tr>
{{each orders as t index}}
{{if (index+1)%2==0}}
<tr style="background-color: aqua;">
<td>{{index}}</td>
<td>{{t.id}}</td>
<td>{{t.title}}</td>
<td>{{t.price}}</td>
</tr>
{{else}}
<tr>
<td>{{index}}</td>
<td>{{t.id}}</td>
<td>{{t.title}}</td>
<td>{{t.price}}</td>
</tr>
{{/if}}
{{/each}}
</table>
</body>
</html>

示例3

get获取表单数据

//get获取表单数据
app.get('/login',function(req,res){
console.log("51账号:"+req.query.name);
console.log("52密码:"+req.query.pass);
console.log("登入!");
});

获取路径参数

//获取路径参数
app.post('/login/:a/:b',function(req,res){
var html=`
<h1>name:${req.params.a}</h1>
<h1>name:${req.params.b}</h1>
`
console.log("登入!");
console.log(req.params);
res.send(html);
});

获取post请求参数

//post
var bodyParser = require('body-parser');
// 创建 application/x-www-form-urlencoded 编码解析
app.use(bodyParser.urlencoded({ extended: false }));
//post获取表单数据
app.post('/login',function(req,res){
console.log("51账号:"+req.body.name);
console.log("52密码:"+req.body.pass);
console.log("登入!");
});

模糊匹配

//模糊匹配 只要是login开头的就会进入
app.use('/login',function(req,res){
console.log(req.url);
res.send("正在登入模糊匹配!");
})

使用静态资源

image

image

//引入模块
var express=require("express");
//服务器
var app=express();
//模板引擎
app.engine('html',require('express-art-template'));
//释放静态资源
app.use("/public",express.static('public'));
//路由 首页
app.get('/',function(req,res){
res.render('homkindex.html');
});
//启动服务器
app.listen(8090,()=>{
console.log("服务器开启 http://127.0.0.1:8090/");
});

//测试静态资源

服务路由分离

新建一个routes文件夹

//routes.js

var express=require("express");
//建立一个容器
var router=express.Router();

router.get("/",function(req,res){
res.render('homkindex.html',);
})

//导出
module.exports=router

界面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link type="text/css" rel="stylesheet" href="/public/css/style.css"/>
</head>
<body>
<h1>首页</h1>
<a href="/homklogin">去登入</a>
<img src="/public/img/1.jpg" width="900px" height="400px"/>
</body>
</html>

npm连接数据库

//项目下面下载mysql
npm i mysql

mysql.js

//测试访问数据库
var mysql=require('mysql');
var conn=mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'root',
database: 'cctv'
})

conn.connect();
var se="select * from c1901";
conn.query(se, function(err,result,fields){
if(err){
console.log("查询错误!");
console.log(err);
}
console.log(result);
//循环数据
for(var obj of result){
console.log(obj.stid +" "+obj.stname);
}
})
conn.end();

服务路由分离连接数据库

mysql.js

//引入mysql
var mysql=require('mysql');
//创建连接
var conn=mysql.createConnection({
//地址
host: 'localhost',
//账号
user: 'root',
//密码
password: 'root',
//数据库
database: 'cctv',
//解决界面时间格式不对
timezone: "08:00"
})

conn.connect();
//导出
module.exports =conn;
--------------------------------------------------------------------
也可以使用下面的
/* 访问mysql 数据库 */
var mysql = require('mysql');

var mydb = {
host : 'localhost',
user : 'root',
password : '12345678',
database : 'study'
};

function runsql(sql,callback,vals=null){
//连接
var conn = mysql.createConnection(mydb);
conn.connect();
if(vals !=null ){
conn.query(sql,vals,callback);
}else{
conn.query(sql,callback);
}
conn.end();
}

//导出
module.exports = runsql

//使用上面的方式
//路由
app.get('/',(req,resp)=>{
let sql = 'select * from p_users';
runsql(sql,(err,rets)=>{
resp.render('index.html',{stus: rets});
});
});

routres下面创建router2.js

var express=require("express");
//引入
var mysql=require("../mysql");
//建立一个容器
var router=express.Router();

router.get("/",function(req,res){
mysql.query("select * from c1901",function(err,result,fields){
if(err){
console.log("查询错误!");
return;
}
res.render('index.html',{
student:result
});
});
})

//导出
module.exports=router

启动服务js

//服务跟路由分离
//引入模块
var express=require("express");
//引入router
var router=require("./routes/router2")
//服务器
var app=express();
//模板引擎
app.engine('html',require('express-art-template'));
//释放静态资源
app.use("/public",express.static('public'));
//使用router
app.use(router);
//启动服务器
app.listen(8090,()=>{
console.log("服务器开启 http://127.0.0.1:8090/");
});

界面

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Mysql数据显示</h1>
<table border="1px" width="30%" style="text-align:center" cellspacing="0">
<tr><td>学生ID</td><td>学生姓名</td><td>演讲时间</td></tr>
{{each student as s index}}
<tr>
<td>{{s.stid}}</td>
<td>{{s.stname}}</td>
<td>{{s.stime}}</td>
</tr>
{{/each}}
</table>
</body>
</html>

路由跳路由 重定向

res.redirect("/");

对MySQL操作

初始化项目

npm init -y

npm i nodemon --save-dev

npm i mysql

npm i express

npm i art-template

npm i express-art-template

mysql.js

var mysql=require('mysql');
var conn=mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'root',
database: 'cctv',
timezone: '08:00'
})

conn.connect();
module.exports = conn;

app1.js

//引入模块
var express = require('express');
var router = require('./routes/router');
//服务器
var app=express();
//模板引擎
app.engine('html',require('express-art-template'));
//释放静态资源
app.use("/public",express.static('public'));
//使用router
app.use(router);
//启动服务
app.listen('8090', function(){
console.log('服务器开启 htpp://127.0.0.1:8090');
})

routers/router.js

var express=require('express');
var router=express.Router();
var mysql=require('../mysql');
var moment=require('moment');
//Post转码
var bodyParser = require('body-parser');
//引入文件上传
var multer=require('multer');

//配置文件上传
const storage=multer.diskStorage({
destination:function(req,file,cb){
cb(null,'./public/upimg');
},
filename:function(req,file,cb){
let oldfilename=file.originalname;
console.log('原文件名:'+oldfilename);

let newfilename=(new Date()).getTime()+"_"+oldfilename;
cb(null,newfilename);
}
})
const upload=multer({storage:storage});

// 创建 application/x-www-form-urlencoded 编码解析
router.use(bodyParser.urlencoded({ extended: false }));
//进入首页界面
router.get('/', function(req, res){
mysql.query("select * from nodestudent",function(err,result,fields){
if(err){
console.log("查询错误!"+err);
return;
}
res.render('index.html',{
student:result
})
})
})

//进入增加学生界面
router.get('/addstudent',function(req, res){
res.render("post.html");
})

//修改学生界面
router.get('/edit/:id',function(req, res){
mysql.query("select * from nodestudent where stid="+parseInt(req.params.id),function(err,result){
if(err){
console.log("修改查询错误!");
return;
}
console.log(result);
res.render("edit.html",{
stu:result
});
})
})

//编辑修改提交
router.post('/stu/edit',function(req, res){
let ssex=req.body.sex;
let sex;
if(ssex=="男"){
sex=1;
}else{
sex=0;
}
//获取时间
let stime = moment().format('yyyy-MM-D h:mm:ss');
//修改语句
let up="update nodestudent set stname=?,stpwd=?,stage=?,stsex=?,sttime=? where stid=?";
var szup=[""+req.body.name+"",""+req.body.pwd+"",parseInt(req.body.age),sex,""+stime+"",parseInt(req.body.id)];
mysql.query(up,szup,function(err,result){
if(err){
console.log("修改错误!");
res.render("edit.html");
}
res.redirect("/");
});
})

//添加学生提交
router.post('/stu/create',function(req, res){
let inst="insert into nodestudent(stname,stpwd,stage,stsex,sttime) VALUES(?,?,?,?,?)";
let ssex=req.body.sex;
let sex;
if(ssex=="男"){
sex=1;
}else{
sex=0;
}
var sttime = moment().format('yyyy-MM-D h:mm:ss');
var student = [""+req.body.name+"",""+req.body.pwd+"",parseInt(req.body.age),sex,""+sttime+""];
console.log(student);
console.log("name:"+req.body.name);
console.log("pwd:"+req.body.pwd);
console.log("age:"+req.body.age);
console.log("sex:"+req.body.sex);
mysql.query(inst,student,function(err,result){
if(err){
console.log("添加错误!");
console.log("err:"+err);
return;
}
console.log("result:"+result);
res.redirect("/");
})

})

//删除操作
router.get('/stu/:id',function(req,res){
console.log("ID:"+req.params.id);
mysql.query("delete from nodestudent where stid="+req.params.id,function(err,result){
if(err){
console.log("删除错误!");
return;
}
res.redirect("/");
})
})

//登入界面
router.get("/login",function(req,res){
res.render("login.html");
})

//注册界面
router.get('/register',function(req,res){
res.render("register.html");
})

//登入提交
router.post('/login',function(req,res){
let log="select * from nodestudent where stname='"+req.body.uname+"' and stpwd='"+req.body.pwd+"'";
console.log(log);
mysql.query(log,function(err,result,fields){
if(err){
console.log("登入查询错误!");
console.log(err);
res.render("login.html");
}
if(result.length==0){
res.render("login.html");
}else{
res.redirect("/");
}

})
})

//注册提交
router.post('/register',upload.single('upimg'),function(req, res){
let re="insert into nodestudent(stname,stpwd,stage,stsex,sttime) VALUES(?,?,?,?,?)";
let ssex=req.body.sex;
let sex;
if(ssex=="男"){
sex=1;
}else{
sex=0;
}
var sttime = moment().format('yyyy-MM-D h:mm:ss');
var student = [""+req.body.username+"",""+req.body.password+"",parseInt(req.body.age),sex,""+sttime+""];
mysql.query(re,student,function(err,result){
if(err){
console.log("注册失败!");
res.render("register.html");
}
res.redirect("/");
})
})

module.exports = router;

image

数据库是文件时操作

初始化项目

npm init -y

npm i nodemon --save-dev

npm i express

npm i art-template

npm i express-art-template

db.json

{
"stus": [
{
"name": "eee",
"pwd": "eee",
"age": "555",
"sex": "女",
"id": 8,
"create_at": "2018-10-19 11-51-41"
},
{
"name": "羡羡5",
"pwd": "123456",
"age": "19",
"sex": "男",
"id": 9,
"create_at": "2022-02-21 11:19:23"
},
{
"id": 10,
"name": "羡羡6",
"pwd": "121",
"age": "18",
"sex": "男",
"create_at": "2022-02-21 12:32:59"
}
]
}

app.js

//引入express
var express = require('express');
//时间
var moment = require('moment');
//文件系统
var fs = require('fs');
//引入路由
//var routers=require('./routers/..');
var app = express();
//导入body
var bodyParser = require('body-parser');
//模板引擎
app.engine('html', require("express-art-template"));
//开启静态资源释放
app.use("/public", express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }))
//使用routers
//app.use(routers);
app.get('/', function (req, res) {
//读取数据文件
fs.readFile('db.json', 'utf-8', function (err, data) {
if (err) {
console.log('首页查询读取错误!');
return;
}
//String --->JSON
var stu = JSON.parse(data).stus;
res.render('index.html', {
student: stu
});
})

})

//去新增
app.get('/stu/create', function (req, res) {
res.render('post.html');
})

//添加新学生
app.post('/stu/create', function (req, res) {
fs.readFile('db.json', 'utf-8', function (err, data) {
if (err) {
console.log('添加读取失败!');
}
//获取提交数据
var stu=req.body;
var st = JSON.parse(data).stus;
//ID+1
var id = st[st.length - 1].id + 1;
//当前时间
var createtime = moment().format('yyyy-MM-D h:mm:ss');
//获取id
stu.id=id;
//放时间
stu.create_at=createtime;
//放入数组
st.push(stu);
var student=JSON.stringify({stus:st});
fs.writeFile("db.json",student,function(err){
if(err){
console.log("添加写入错误!");
}
res.redirect('/');
})
})

})

//删除
app.get("/stu/delete/:id",function(req,res){
console.log("删除ID:"+req.params.id);
fs.readFile('db.json', 'utf-8', function (err, data) {
if (err) {
console.log('添加读取失败!');
}
let stu=JSON.parse(data).stus;
//遍历找下标
var find=stu.findIndex(function (index) {
//下标的ID==传的ID 就返回
if(index.id==req.params.id) {
return index;
}
})
//删除 删除下标未find的1个
stu.splice(find, 1);
var student=JSON.stringify({stus:stu});
fs.writeFile("db.json",student,function(err){
if(err){
console.log("添加写入错误!");
}
res.redirect('/');
})
})
})

//修改查询
app.get('/stu/edit/:id',function(req, res){
console.log("查询ID:"+req.params.id);
fs.readFile('db.json', 'utf-8', function (err, data) {
if (err) {
console.log('修改查询读取失败!');
}
let stu=JSON.parse(data).stus;
var stud=stu.find(function(items){
return items.id==req.params.id;
})
res.render('edit.html',{
studs:stud
})
})
})

//修改
app.post('/stu/edit',function (req, res){
var upst=req.body;
fs.readFile('db.json', 'utf-8', function (err, data) {
if (err) {
console.log('修改读取失败!');
}
let stu=JSON.parse(data).stus;
let time= moment().format('yyyy-MM-D h:mm:ss');
upst.create_at=time;
upst.id=parseInt(upst.id);
var oldid=stu.findIndex(function (index){
return index.id==upst.id;
})
stu[oldid]=upst;

var newst=JSON.stringify({stus:stu});
fs.writeFile("db.json",newst,function(err){
if(err){
console.log("修改写入错误!");
}
res.redirect('/');
})
})
})

//端口
var prot = 8090;
//监听
app.listen(prot, function () {
console.log("服务器开启 端口 " + prot + "....")
})

返回JSON

//返回JSON
app.get('/testjson', function (req, res) {
let stu = {
name: 'temo',
age: 18,
sex: '男'
}
res.send(stu);
})

跨域

方式一

//中间件跨域 写在所有路由器的最前面
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');
if (req.method == 'OPTIONS') {
res.send(200);
}
else {
next();
}
});

//需要跨域的路由
app.get('/testjson', function (req, res) {
let stu = {
name: 'temo',
age: 18,
sex: '男'
}
res.send(stu);
})

//测试
$(function () {
$("#getsj").click(function () {
$.ajax({
url: 'http://127.0.0.1:8090/testjson',
success: function (data) {
console.log(data);
console.log(data.name);
}
})
});
})

方式二

//下载cors
npm i cors
//使用
var cors=require('cors');
app.use(cors());

文件上传至项目

先下载multer
//npm i multer

//文件上传模块
var multer=require('multer');
//配置上传
const storage=multer.diskStorage({
destination:function(req,file,cb){
//文件存放的位置
cb(null,'./upimg')
},
filename:function(req,file,cb){
//原来的文件名
let oldfilename=file.originalname;
console.log("原文件名:"+oldfilename);
//修改文件名
let newfilename=(new Date()).getTime()+"-"+oldfilename;
console.log("保存到服务器的文件名:"+newfilename);
cb(null,newfilename);
}
})
//文件使用配置
const upload=multer({storage:storage});

//文件上传的 upimg=for表单的文件框的name
app.post('/upimg',upload.single('upimg'),function (req, res){
//如果有文本域 :req.body
console.log("上传成功!");
console.log(req.file);
})

//界面
<form action="/upimg" method="post" enctype="multipart/form-data">
<input type="file" name="upimg"/><button type="submit">上传</button>
</form>

文件上传至云存储

准备

下载包
//中间件
npm i connect-multiparty
//云存储
npm i cos-nodejs-sdk-v5 --save

界面

<form action="/upfil" method="post" enctype="multipart/form-data">
<input type="file" name="upimg"/>
<button type="submit">上传</button>
</form>

routers.js

//引入包
var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();
//文件系统
var fs = require("fs");
//秘钥查看:https://console.cloud.tencent.com/cam/capi
var cos = new COS({
//ID
SecretId: 'ID',
//秘钥
SecretKey: '秘钥'
});
router.post("/upfil",multipartMiddleware,function (req, res) {
//upimg就是表单的文件上传框的name
//获取文件对象本地路径
const filePath = req.files.upimg.path
//获取原文件名
let oldfilename=req.files.upimg.name;
var hk=oldfilename.indexOf('.');
//截取点前面的内容
var qm=oldfilename.substring(0,hk);
//截取点后面的内容
var hm=oldfilename.substring(hk+1,oldfilename.length);
//时间戳
var timestamp = (new Date()).getTime();
//最终的文件名
let newcloudname=timestamp+"."+hm;
console.log("最后的文件名:"+newcloudname);
cos.putObject({
//储存桶名称
Bucket: 'sls-study-cloud-1301165591',
//地区
Region: 'ap-guangzhou',
//上传的文件名key 直接文件名的话就上传到桶下面
//如果有文件的路径的话就在指定路径下 如下是在储存桶下的NodeJS的文件夹
//最后文件会传到NodeJS的文件夹下面
Key: '/NodeJS/'+newcloudname,
StorageClass: 'STANDARD',
Body: fs.createReadStream(filePath),//上传文件对象
ContentLength: fs.statSync(filePath).size,//文件的大小
onProgress: function (progressData) {
console.log(JSON.stringify(progressData));
}
}, function (err, data) {
//200就上传成功
if(data.statusCode==200){
console.log("访问链接:"+"https://"+data.Location);
res.redirect("/");
}else{
//输出错误
console.log(err);
}
});
})

表单提交返回

req.files

iShot2022-02-22 17.22.02

上传成功返回

statusCode:状态码
Location:文件的路径

iShot2022-02-22 17.21.50

解决服务器关闭终端后项目停止的问题

使用出现为找到命令的话

建立连接

ln -s pm2的安装路径 /bin

//可以使用ll查看文件连接的情况

image

网站接口服务器的NodeJS项目

安装完成pm2

npm install pm2 -g

启动

用程序目录下运行
pm2 startup

或者单独文件
pm2 start my_app.js

服务器重启后自动恢复运行状态

pm2 save

后更新pm2

pm2 update

https://app.pm2.io/ 进入这个网站注册用户创建储存库在服务器下执行2个命令即可

image

使用redis

下载redis

//需要添加版本 最新版本没有自动连接会报错
npm i redis@3.1.2

使用

const redis = require("redis");
// 连接 Rnode
const client = redis.createClient(6379,"47.101.177.78",{auth_pass:'root'});
//设置值
client.set('nodename','李四');
//10秒后过期
//client.expire('nodename',10);
//得到
client.get('nodename',function (err, data) {
console.log(data);
})
//删除
client.del('nodename',function (err, data) {
if(err){
console.log("14:删除失败!");
}else{
console.log("15:成功!");
}
})
client.get('nodename',function (err, data) {
console.log("21:"+data);
});