node js

node js


一 .运行nodejs文件的方法


1. win + r 打开运行 输入cmd打开命令提示符
node -v 查看node.js的版本号
npm -v node包管理工具版本号
cd / 回到根目录
输入cd 拖入要运行的node.js 所在的文件夹 回车 输入node 文件名 回车 运行node.js
2. 利用小黑框 所在的文件夹里右键点 git bash here
输入 node 文件名 回车 运行node.js文件
3. 在所在的文件夹里按shift 右键打开 “在此处打开powershell"窗口”
输入 node 文件名 回车 运行node.js文件
4. vs code 自带终端
在vs code里------------资源管理栏所在的文件名右键----------在终端打开
输入 node 文件名 回车 运行node.js文件

二.在黑框上直接写node代码


输入 node ------- 回车 ------- 然后输node.js的代码;

三.Node 模块

开发步骤: 下包(第三方模块) ===> 导包 ====> 用包
内置模块: 英文文档官网: https://nodejs.org/en/
中文文档官网: http://nodejs.cn/
fs文件系统模块:
1.删除文件
const fs = require('fs');     //引入内置fs模块
											  //调用unlink方法来删除文件
fs.unlink('./tmp/text.html', (err) => {       //第一个参数是文件路径,第二个是回调函数
  if (err) throw err;                         //表示删除的信息
  console.log('已成功删除 /tmp/text.html');
});
2.查看文件
const fs = require('fs'); //引入内置的fs模块

fs.readFile('./tmp/text.html','utf-8' , (err, data) => {  //查看的文件路径 字符编码 回调函数
    if (err) throw err;                             	  //err为错误信息 data为查看的文件内容
    console.log(data);
});
3.创建文件
//创建带内容的文件
const fs = require('fs');      //引入内置的fs模块
const data = `这是一个寂寞的天,
              下着有些伤心的雨
              作者: 林立群`
fs.writeFile('C:\\Users\\ASUS\\Desktop\\node js\\第二天\\files\\2.txt' , data ,(err) => {
    if(err == null){						//绝对路径的写法, 
        console.log('文件创建成功');			//err为错误信息,错误信息为null则为获取内容成功
    }else{
        console.log('文件没有创建成功');   
    }
})

四.cmder 黑框的使用:

  1. node -v 查看node.js的版本号
  2. npm -v node包管理工具版本号
  3. cd / 回到根目录
  4. cd …/ 当前目录的上级目录
  5. cd 文件夹名 当前目录的下级目录
  6. clear 清屏
  7. pwd 显示当前目录
  8. ls 显示当前目录中的文件
  9. touch 文件名 在当前目录下新建一个文件
  10. mkdir 文件夹名 在当前目录下新建一个文件夹
  11. rm -rf 文件名 删除当前目录下的文件
  12. code 文件夹/文件名 用vscode打开当前目录下的某文件
  13. mkdir 文件夹名 在当前目录下新建一个文件夹
  14. node 文件名 运行nodejs文件
同步和异步:
程序自上而下的执行称为同步; (顺序执行)
不用等待上面的运行完后再运行下面的操作称为异步; ( 如计时器 ; 回调函数 )

五.Nodejs 的路径:

相对路径
//获取文件的内容
const fs = require('fs');      //引入内置的fs模块
fs.readFile('./files/1.txt', 'utf-8', (err,data) => {      //相对路径,也就是相对自身的路径
    if (err == null){				//err为错误信息,错误信息为null则为获取内容成功
        console.log(data);          //data为获取的文件内容
    }else{
        console.log(err);   
    }
})
绝对路径
//创建带内容的文件
const fs = require('fs');      //引入内置的fs模块
const data = `这是一个寂寞的天,
              下着有些伤心的雨
              作者: 林立群`
fs.writeFile('C:\\Users\\ASUS\\Desktop\\node js\\第二天\\files\\2.txt' , data ,(err) => {
    if(err == null){						//绝对路径的写法, 
        console.log('文件创建成功');			//err为错误信息,错误信息为null则为获取内容成功
    }else{
        console.log('文件没有创建成功');   
    }
})
重要 : 与路径有关的两个全局变量
_ _ dirname 当前nodejs文件所在的文件夹的绝对路径 C:\Users\ASUS\Desktop\node js\新建文件夹
_ _ filename 当前nodejs文件的绝对路径 C:\Users\ASUS\Desktop\node js\新建文件夹\node.js
//创建带内容的文件
const fs = require('fs');      //引入内置的fs模块
const data = `这是一个寂寞的天,
              下着有些伤心的雨
              作者: 林立群`
fs.writeFile(`${_ _dirname}\\files\\3.txt` , data ,(err) => {  //模板字符串 ${_ _dirname}
    if(err == null){						//绝对路径的写法, 
        console.log('文件创建成功');			//err为错误信息,错误信息为null则为获取内容成功
    }else{
        console.log('文件没有创建成功');   
    }
})
//查看文件内容
const fs = require('fs');						//引入内置的fs模块
fs.readFile(`${__dirname}\\files\\3.txt`,'utf-8',(err,data) => {
    if(err == null){
        console.log(data + '\n查看成功');
    }else{
        console.log('查看失败');
    }
})

六.path路径模块

帮助我们拼接路径 const url = pass.join( _ _dirname , “files\3.txt” );
const fs = require('fs');               			//引入内置的fs模块
const path = require('path');						//引入内置的path模块
const url = path.join(__dirname,"files","3.txt");	//用path模块中的join方法拼接路径
fs.readFile(url,(err,data) => {						//查看文档内容readFile
    if(err == null){
        console.log(data + '\n查看成功');
    }else{
        console.log(err);
    }
})

七.搭建自己的web服务器

		// 引入http模块
const http = require('http');
		//创建一个服务器   
const server = http.createServer((req,res) => {
    	res.setHeader('Content-Type', 'text/html;charset=utf-8');
    	//如果响应的内容有中文必须设置如上代码;
        res.end('hello woirld');
        //req 为请求的内容
        //res 为响应的内容
});          
		//开启服务器
server.listen(1966, ( )=> {        //参数1 : 1966为服务器端口
    console.log('服务器开启成功!');   //参数2 : 服务器开启成功之后的回调函数
})
端口的概念:
端口就是计算机与外界通信的的途径;
端口号—具有网络功能的应用软件的标识号( 范围是从0 到65535 );
端口号是不固定的 , 可以由用户手工可以分配;
搭建web服务器
// 引入内置http模块
const http = require('http');

// 引入内置fs模块
const fs = require('fs');

//引入内置路径拼接模块
const path = require('path');

//创建一个服务器
const server = http.createServer((req,res) => {
    //req是用户发送的请求内容 res为服务器响应回去的内容;
    const fullPath = path.join(__dirname,"files",'index.html');
    fs.readFile(fullPath,'utf-8',(err,data)=>{
        if(err == null){
            //把读取到的内容返回给用户
            res.end(data);      //data 为读取到的内容,
        }else{
            res.end('页面被外星人劫持了')
        }
    })
});
//开启服务器
server.listen(1966,()=>{
    console.log('服务器开启成功');  //1966设置的服务器端口;回调函数是服务器开启成功后的执行内容
    
});
//根据用户请求的静态资源名
const fs = require('fs');
const http = require('http');
const path = require('path');

const server = http.createServer((req, res) => {
    console.log(req.url);   //用户请求的静态资源名
    const fullPath = path.join(__dirname, 'files', req.url);
    //_ _dirname 当前nodejs文件所在的文件夹的绝对路径;
    // fullPath 请求静态资源路径的拼接
    fs.readFile(fullPath, (err, data) => {
        if (err == null) {
            res.end(data);  		   //把读取到的内容返回给用户
        } else {
            res.end('网页狗吃了!!!');	//把读取到的内容返回给用户
        }
    })
});
//开启服务器
server.listen(1966, () => {
    console.log('服务器开启成功');
    //1966设置的服务器端口;回调函数是服务器开启成功后的执行内容
});

八.第三方模块的使用:

一 . 初始化配置文件 :npm init -y 会创建一个package.json文件,里面保存了项目的一些信息;
二 . npm i 模块名 进行下载配置包( package-lock.json 和 node_modules文件夹 );
package-lock.json和package.json记录了第三方模块的配置信息;
node_modules文件夹里保存了第三方模块的配置文件,
如果第三方配置文件被删除,利用终端命令 npm i 可根据配置信息重新下载配置文件;

九.利用第三方模块express 搭建web服务器

初始化配置文件 npm init -y
配置npm指向淘宝镜像 npm config set registry https://registry.npm.taobao.org/
输入命令 npm i express 进行下载包
const express = require('express');  //导入express包;

const app = express();

app.use(express.static('public'));  
//通过这条代码可以实现public目录下的文件对外开放了;

app.get('/', function (req, res) {   //req为请求的内容,res为服务器响应的内容
  //在找不public文件的时候响应的内容;
  res.send('Hello World');
});
 
app.listen(1966,()=>{
    console.log('服务器开启成功!')
});

十.利用第三方模块nodemon实时更新nodejs的运行

1.初始化配置文件 npm init -y
2.下载匹配包 npm install -g nodemon 在全局下载配置包 所有的文件都可以用
npm install nodemon 在当前文件夹下载配置包 只有当前文件可以用
3.利用nodemon模块在终端运行nodejs的命令 : nodemon xxx.js ;
(nodemon 模块的作用: nodejs代码有任何变化都会自动重启服务器 ; )
默认在终端运行nodejs代码命令 node xxx.js

十一.利用第三方模块express 实现简单的接口

接口文档 : 接口地址 : http://192.168.216.1:1966/jock ; 本地ip/jock;
请求方式: get;
请求参数: 无;
响应内容: “这是一个寂寞的天,下这些伤心的雨!”;
//一个简单的接口,返回字符串
const express = requir('express');     //引入express模块;
const app = express();                 //创建一个服务器

app.get('/jock',(req,res) => {         //get为设置的请求方式,
    res.send('这是一个寂寞的天,下这些伤心的雨!')
});
app.lesten(1966,() => {
    console.log('服务器开启成功');      //1966设置的服务器端口;回调函数是服务器开启成功后的执行内容
});
//一个简单的接口返回对象;
const express = require('express');          //引入express模块;
const app = express();						 //创建一个服务器

app.get('/food',(req,res)=>{				// 设置请求方式为get,接口地址为本地ip/food;
    res.send({
        id:1,
        foodName:'junk-food',
        msg:'这是一个很好吃的零食,好难吃'
    });                						//响应的内容是一个对象
});
app.listen(1966,()=>{				//1966设置的服务器端口;回调函数是服务器开启成功后的执行内容
    console.log('success');          //开启接口服务器
})
☀☀☀☀☀ 注意: get : 一般为获取数据;
post :一般为请求数据;

get请求需要传参数的接口:

const express = require('express');
const app = express();

app.get('/getName',(req,res)=>{
    //console.log(req.query);            //req.query为用户传递过来的参数,内容是一个对象;
    // const name = req.query.name;     
    const {name} = req.query;           //对用户传递进来的对象进行对象结构; 获取用户传过来的name值
   
    let nickName = null;          //准备一个变量来接收name所对应的昵称;
    switch(name){
        case '谢强': nickName = '气味大师';
        break;
        case '林长老': nickName = '学霸一绝';
        break;
        case '周木木': nickName = '天才';
        break;
        default:nickName = '不知道的英雄';
        break;
    }
    res.send({                //返回给用户的数据
        msg:'请求成功',         //用来告诉用户服务器响应成功
        name:name,
        nickName:nickname
    });
});
app.listen(1966,()=>{
    console.log('success');   //1966设置的服务器端口;回调函数是服务器开启成功后的执行内容
})
一个简单的post接口
const express = require('express');
const app = express();

app.post('/post',(req,res)=>{
    res.send(					//返回给用户的数据
        '成功'				   //用来告诉用户服务器响应成功
    )
});
app.listen(1966,()=>{            
    console.log('success');  //1966设置的服务器端口;回调函数是服务器开启成功后的执行内容
})

post 请求 验证账号和密码的登录接口

借助第三方模块body-parser来获取用户传过来的参数
在终端的当前文件夹里 输入命令 npm i body-parser 进行下载body-parser模块
//登录接口,带有文本参数
//登录传递进来的参数有用户名和密码; 

const express = require('express');   //引入express模块

const bodyParser = require('body-parser');      //引入body-parser模块

const app = express();                //创建服务器

app.use(bodyParser.urlencoded({ extended: false }));    //设置请求头,就是把用户传递过来的参数转化为url格式;

app.post('/login',(req,res) =>{  
    //接收用户传递进来的用户名和密码;
    // 在post请求下,req.quert不接收用户传递过来的参数 ;   
    //需要使用第三方模块  body-parser
     console.log(req.body);    // post请求里面 req.body 为用户传递进来的参数
     const {userName,passWord} = req.body;
     console.log(userName , passWord);

     let obj = null;
     if(userName == 'admin' && passWord == '123456'){
        obj = {
            msg : '登录成功',
            code:200
        }
     }else{
        obj = {
            msg : '登录失败',
            code:300
        }
     }
     
    res.send(obj);
});

app.listen(1966,()=>{                //开启一个接口为1966的服务器
    console.log('success');          //开启成功后返回的内容
    
});

post请求获取用户传入的文件

借助第三方模块multer来获取用户传过来的参数
在终端的当前文件夹里 输入命令 npm i multer 进行下载multer模块
// 接口地址: ip:1966/register;
// 请求方式:post;
// 请求参数:FormData;

// 实现注册接口,要求能接收用户的头像文件

const express = require('express');     //引入express模块
const app = express();                  //创建一个服务器

const multer = require('multer');    	//引入第三方multer模块

var upload = multer({ dest: 'uploads/' });     //在当前目录创建一个uploads文件夹,用来存放文件;

app.post('/register', upload.single('userIcon'), function (req, res, next) {
     console.log( req.file);      //传入的文件的信息
     console.log(req.body);       //传入的参数
    
    //规定使用formData传递数据;
    //使用第三方模块 multer 来接收数据;
    res.send('成功');
});


app.listen(1966, () => {
    console.log('success');
});

后端路由

路由就是根据不同的 url 地址展示不同的内容或页面;
后端路由是通过相对应url执行后端代码块;
const express = require('express');

const app = express();

//注册post
app.post('/regiter',(req,res)=>{
    //注册逻辑
    res.send('注册成功!');
});
//登录post
app.post('/login',(req,res)=>{
    //登录逻辑
    res.send('登录成功!');
});
//登出get
app.get('/logout',(req,res)=>{
    //登出逻辑
    res.send('登出成功!');
});
//新增post
app.post('/add',(req,res)=>{
    //新增逻辑
    res.send('新增成功!');
});
//删除get
app.get('/delete',(req,res)=>{
    //删除逻辑
    res.send('删除成功!');
});

app.listen(3000,()=>{
    console.log('success');
});
中间件的使用
//引入express模块
const express = require('express');
// 创建一个服务器
const app = express();
//中间件1
app.use((req,res,next)=>{
    req.xxx = "嘻嘻嘻";
    next();
});
//中间件2
app.use((req,res,next)=>{
    req.yyy = "嘿嘿嘿";
    next();
});

//注册路由
app.get('/sb',(req,res)=>{
    res.send('呵呵'+ req.xxx + req.yyy);
});

// 开启服务器
app.listen(4399,()=>{
    console.log('服务开启成功!');
});

同源和跨域以及解决方法

调用后台接口时,如果调用页面的
. 1.同源指的是三个相同: 协议 地址 端口号
. 2.目的 : 是为了保证用户信息的安全,防止恶意的网站窃取数据
. 3.跨域 : 协议 地址 端口号 只要有不同就是不同源,也叫做跨域

[外链图片转存失败(img-9pFuRsNw-1566823871129)(C:\Users\ASUS\Desktop\笔记\image\Snipaste_2019-07-25_16-28-32.png)]

解决跨域问题方法:
//引入第三方express模块
const express = require('express');
//创建一个服务器
const app = express();

//解决跨域问题方法一:引入cors模块解决跨域问题
const cors = require('cors');
//使用第三方模块cors来设置响应头
app.use(cors());

//解决跨域问题方法二:设置一个中间件,设置解决跨域问题 ,允许资源共享的响应头
app.use((req,res,next)=>{
    res.setHeader('Access-Control-Allow-Origin',"*");
    next();     //继续执行路由,如果不设置next(),将不会执行注册路由的代码
})

//注册路由
//创建一个get请求接口
app.get('/add',(req,res)=>{
    // res.setHeader('Access-Control-Allow-Origin',"*");   
    //解决不同源问题也可以说是跨域问题,允许资源共享的响应头
    res.send('增加成功');
});

//创建一个post请求接口
app.post('/login',(req,res)=>{
    // res.setHeader('Access-Control-Allow-Origin',"*");  
    //解决不同源问题也可以说是跨域问题,允许资源共享的响应头
    res.send('登录成功');
});

//开启服务器
app.listen(1966,()=>{
    console.log('success');   
});

引入自定义模块


const express = require('express');  // 导入第三方express模块,
const app = express();   // 创建服务器

const path = require('path');     //导入第三方path模块 ,用来拼接路径   
const dbPath = path.join(__dirname,'utils','db.js');  // 获取自定义模块的js路径

const db = require(dbPath);  //引入自定义模块

const bodyParser = require('body-parser')    //导入第三方body-parser模块,用于接收post请求的参数
app.use(bodyParser.urlencoded({ extended: false }));  //设置请求头

const multer = require('multer');     //导入第三方multer模块,用于接收post请求中的formData内容
var upload = multer({ dest: 'icon/' }); //创建一个接收请求文件的文件夹

const cors = require('cors');   // 引入第三方模块cors,用于解决跨域问题;
app.use((req,res,next)=>{
    res.setHeader('Access-Control-Allow-Origin',"*");     //允许资源共享的响应头
    next();
});

app.use(express.static('uploads'));   //使用户可以访问uploads这个文件夹


//登录模块
app.post('/login',(req,res)=>{
    // console.log(req.body);
    const {userName,passWord} = req.body;   //引入body-parser才能用
    // console.log(userName,passWord);  
    if(userName == 'mibo' && passWord == '123456'){
        res.send({
            code:200,
            msg:'登录成功',
        });
    }else{
        res.send({
            code:400,
            msg:'登录失败',
        });
    };
});

//查询英雄列表
app.get('/list',(req,res)=>{        
    const data = db.getHeros();    //调用自定义模块
    if(data){
        res.send({
            code:200,
            msg:'获取成功',
            data:data,
        })
    }else{
        res.send({
            code:400,
            msg:'获取失败',
        })
    }
});


app.listen(1966,()=>{
    console.log('服务器开启成功');
});

十二. jsonp

0 . 什么是jsonp

JSONP是JSON with Padding的略称。它是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式).

1.JSONP的由来

根据浏览器同源策略,a 域的js不能直接访问 b域名的信息,但是script 标签的src属性可以跨域引用文件,jsonp是请求之后后台包装好一段json,并且把数据放在一个callback函数,返回一个js文件,动态引入这个文件,下载完成js之后,会去调用这个callback,通过这样访问数据。

2 . JSONP有什么用

由于同源从略的限制,XMLHttpRequest只允许请求同源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后再服务端输出JSON数据并执行回调函数,从而解决跨域数据请求

3 . jsonp 的缺点

它并不是ajax,它是在文档中插入一个script标签,创建callback方法,通过服务器配合执行callback方法,并传入一些参数. JSONP的局限就在于,因为是通过插入script标签,所以参数只能通过url传入,因此只能满足get请求,特别jQuery的ajax方法时,即使设置type: ‘POST’,但是只要设置了dataType: ‘jsonp’,在请求时,都会自动使用GET请求;

十三.利用自己抽取的操作数据库的工具模块写接口

// 导包
const express = require('express');
const path = require('path');
const multer = require('multer');
const bodyParser = require('body-parser');
// 导入我们自己抽取的db模块
const db = require(path.join(__dirname,'utils','db.js'));

//创建服务器
const app = express();

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))

//注册路由
//注册用户
app.post('/register',(req,res)=>{
    //接收用户提交过来的用户名和密码
    const {username,password} = req.body;
    //通过操作数据库,把这个用户名和密码添加到对应的库表中去.
    //1.使用db.js查询一下这个用户名有没有被注册过.
    db.connection.query(`select * from userplus where username = "${username}" `,(err,data)=>{
        if(err == null){
            //继续判断
            //console.log(data);
            if(data.length == 0){
                //没有数据,说明可以注册
                db.connection.query(`insert into userplus(username,password) values('${username}','${password}')`,(error,resulte)=>{
                    if(error == null){
                        //注册成功
                        res.send({
                            code:200,
                            msg:'注册成功!'
                        });
                    }else {
                        //注册失败
                        res.send({
                            code:500,
                            msg:'注册失败,服务器内部错误'
                        });
                    }
                });
            }else {
                //说明这个用户名已经被注册了.
                res.send({
                    code:400,
                    msg:'兄弟,该用户名已经被注册,请换一个'
                });
            }
        }else {
            res.send({
                code:500,
                msg:'服务器内部错误'
            });
        }
    });
});

//获取所有的英雄
app.get('/list',(req,res)=>{
    //调用db.js操作数据库,返回所有的英雄.
    db.connection.query(`select id,name,skill,icon from hero where isDelete = 'false' order by id asc`,(err,data)=>{
        if(err == null){
            //继续判断
            res.send({
                code:200,
                msg:'查询成功',
                data
            });
        }else {
            res.send({
                code:500,
                msg:'服务器内部错误'
            });
        }
    });
});

//开启服务器
app.listen(4399,()=>{
    console.log('success');
});
// 这是专门用来操作数据库的工具模块
// 导包
var mysql = require("mysql");
var connection = mysql.createConnection({
  host: "localhost", //数据库服务器地址
  user: "root",
  password: "root",
  database: "sanqiqi"
});

//数据库连接开启
connection.connect();

// 暴露出去
module.exports = {
    //connection:connection
    connection
}
//数据库连接关闭
//connection.end();
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值