前端学习笔记-Ajax篇

news2024/12/23 9:19:20

第1章:原生AJAX

1.1Ajax简介

AAX 全称为 Asynchronous JavaScript And XML,就是异步的 JS 和 XML。

通过 AAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。

AAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。

1.2 XML 简介

XML 可扩展标记语言。
XML 被设计用来传输和存储数据。
XML 和 HTML 类似,不同的是 HTML中都是预定义标签,而XML中没有预定义标签全都是自定义标签,用来表示一些数据。

比如说有一个学生数据:
name="孙悟空";age=18;gender="男";
用 XML 表示:

<student>
    <name>孙悟空</name>
    <age>18</age>
    <gender>男</gender>
</student>

现在以及被json取代了,使用json表示{"name":"孙悟空","age":18,"gender":"男"}

1.3AJAX的特点


1.3.1 AJAX 的优点

  1. 可以无需刷新页面而与服务器端进行通信。
  2. 允许你根据用户事件【鼠标事件、键盘事件、表单事件等来更新部分页面内容。

1.3.2 AJAX 的缺点

  1. 没有浏览历史,不能回退
  2. 存在跨域问题(同源)
  3. SEO 不友好

//1.引入express
const express = require('express');

//2.创建应用对象
const app = express();

//3.创建路由规则
// request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/',(request,response)=>{
    //设置响应
    response.send('hello!express');
});

//4.监听端口启动服务
app.listen(8000,()=>{
    console.log("服务已经启动,8000 端口监听中......");
});

1.4 AJAX 的使用

1.4.1 核心对象

XMLHttpRequest AJAX 的所有操作都是通过该对象进行的。

1.4.2 使用步骤

1) 创建 XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
2) 设置请求信息
xhr.open(method, url);
// 可以设置请求头,一般不设置
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
3) 发送请求
xhr.send(body) //get 请求不传 body 参数,只有 post 请求使用
4) 接收响应
//xhr.responseXML 接收 xml 格式的响应数据
//xhr.responseText 接收文本格式的响应数据
xhr.onreadystatechange = function (){
if(xhr.readyState == 4 && xhr.status == 200){
var text = xhr.responseText;
console.log(text);
}
}

 关于JSON请求的相关设置

//server.js文件修改
//1.引入express
const express = require('express');

//2.创建应用对象
const app = express();

//3.创建路由规则
// request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //设置响应体
    response.send('HELLO AJAX');
});
//可以接受任意类型的请求
app.all('/server',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //响应头
    response.setHeader('Access-Control-Allow-Headers','*');
    //设置响应体
    response.send('HELLO AJAX POST');
});
//可以接受任意类型的请求
app.all('/json-server',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //响应头
    response.setHeader('Access-Control-Allow-Headers','*');
    //响应一个数据
    const data = {
        name:'hjj'
    };
    //对对象进行字符串转换
    const str = JSON.stringify(data);
    //设置响应体
    response.send(str);
});

//4.监听端口启动服务
app.listen(8000,()=>{
    console.log("服务已经启动,8000 端口监听中......");
});
//JSON.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JSON响应</title>
    <style>
        #result{
            width: 200px;
            height: 100px;
            border: solid 1px #903;
        }
    </style>
</head>
<body>
    <div id="result"></div>
    <script>
        //获取元素对象
        const result = document.getElementById("result");
        //绑定键盘按下事件
        window.onkeydown = function(){
            //1.发送请求
            const xhr = new XMLHttpRequest();
            //设置相应体的数据类型
            xhr.responseType = 'json';
            //2.初始化
            xhr.open('GET','http://127.0.0.1:8000/json-server');
            //3.发送
            xhr.send();
            //4.事件绑定 处理服务器返回的结果
            xhr.onreadystatechange = function(){
                //判断(服务器返回了所有的结果)
                if(xhr.readyState === 4){
                    //判断响应状态码 2xx就是成功的状态
                    if(xhr.status >= 200 &&xhr.status < 300){
                        //处理结果 行 头 空行 体
                        //响应行
                        //result.innerHTML = xhr.response;
                        //1.手动对数据转换
                        //let data = JSON.parse(xhr.response);
                        //result.innerHTML = data.name;
                        //console.log(xhr.response);
                        //2.自动对数据转换
                        console.log(xhr.response);
                        result.innerHTML=xhr.response.name;
                    }
                }
            }
        }
    </script>
</body>
</html>

1.4.3 解决 IE 缓存问题

问题:
在一些浏览器中 (IE), 由于缓存机制的存在, ajax 只会发送的第一次请求,剩余多次请求不会在发送给浏览器而是直接加载缓存中的数据。
解决方式:
浏览器的缓存是根据 url 地址来记录的,所以我们只需要修改 url 地址即可避免缓存问题
xhr.open("get","/testAJAX?t="+Date.now());
//server.js文件内容
//1.引入express
const express = require('express');

//2.创建应用对象
const app = express();

//3.创建路由规则
// request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //设置响应体
    response.send('HELLO AJAX');
});
//可以接受任意类型的请求
app.all('/server',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //响应头
    response.setHeader('Access-Control-Allow-Headers','*');
    //设置响应体
    response.send('HELLO AJAX POST');
});
//可以接受任意类型的请求
app.all('/json-server',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //响应头
    response.setHeader('Access-Control-Allow-Headers','*');
    //响应一个数据
    const data = {
        name:'hjj'
    };
    //对对象进行字符串转换
    const str = JSON.stringify(data);
    //设置响应体
    response.send(str);
});
//针对IE缓存
app.get('/ie',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //设置响应体
    response.send('HELLO IE');
});
//4.监听端口启动服务
app.listen(8000,()=>{
    console.log("服务已经启动,8000 端口监听中......");
});
//4-IE缓存.html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #result{
            width: 200px;
            height: 100px;
            border: solid 1px #258;
        }
    </style>
</head>
<body>
    <button>点击发送请求</button>
    <div id="result"></div>
    <script>
        //获取元素
        const btn = document.getElementsByTagName('button')[0];
        const result = document.querySelector('#result');
        //绑定事件
        btn.addEventListener('click',function(){
            //1.发送请求
            const xhr = new XMLHttpRequest();
            //2.初始化
            xhr.open("GET",'http://127.0.0.1:8000/ie?t='+Date.now());
            //3.发送
            xhr.send();
            //4.事件绑定 处理服务器返回的结果
            xhr.onreadystatechange = function(){
                //判断(服务器返回了所有的结果)
                if(xhr.readyState === 4){
                    //判断响应状态码 2xx就是成功的状态
                    if(xhr.status >= 200 &&xhr.status < 300){
                        //处理结果 行 头 空行 体
                        //响应行
                        result.innerHTML=xhr.response;
                    }
                }
            }
        })
    </script>
</body>
</html>

1.4.4 AJAX 请求状态

xhr.readyState 可以用来查看请求当前的状态
https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/readyState
0: 表示 XMLHttpRequest 实例已经生成,但是 open() 方法还没有被调用。
1: 表示 send() 方法还没有被调用,仍然可以使用 setRequestHeader() ,设定 HTTP 请求的头信息。
2: 表示 send() 方法已经执行,并且头信息和状态码已经收到。
3: 表示正在接收服务器传来的 body 部分的数据。
4: 表示服务器数据已经完全接收,或者本次接收已经失败了
//网络请求超时与网络异常.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>网络请求超时与网络异常</title>
    <style>
        #result{
            width: 200px;
            height: 100px;
            border: solid 1px #258;
        }
    </style>
</head>
<body>
    <button>点击发送请求</button>
    <div id="result"></div>
    <script>
        //获取元素
        const btn = document.getElementsByTagName('button')[0];
        const result = document.querySelector('#result');
        //绑定事件
        btn.addEventListener('click',function(){
            //1.发送请求
            const xhr = new XMLHttpRequest();
            //超时设置 2s 设置
            xhr.timeout = 2000;
            //超时回调
            xhr.ontimeout = function(){
                alert("网络异常,请稍后重试哦bb~")
            }
            //网络异常回调
            xhr.onerror = function(){
                alert("你的网络似乎出了一些问题哦bb~")
            }
            //2.初始化
            xhr.open("GET",'http://127.0.0.1:8000/delay');
            //3.发送
            xhr.send();
            //4.事件绑定 处理服务器返回的结果
            xhr.onreadystatechange = function(){
                //判断(服务器返回了所有的结果)
                if(xhr.readyState === 4){
                    //判断响应状态码 2xx就是成功的状态
                    if(xhr.status >= 200 &&xhr.status < 300){
                        //处理结果 行 头 空行 体
                        //响应行
                        result.innerHTML=xhr.response;
                    }
                }
            }
        })
    </script>
</body>
</html>
//6-取消请求.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>取消请求</title>
</head>
<body>
    <button>点击发送请求</button>
    <button>点击取消请求</button>
    <script>
        //获取元素对象
        const btns = document.querySelectorAll('button');
        let x=null;
        btns[0].onclick = function(){
            x = new XMLHttpRequest();
            x.open("GET",'http://127.0.0.1:8000/delay');
            x.send();
        }
        //取消请求abort
        btns[1].onclick = function(){
            x.abort();
        }
    </script>
</body>
</html>
//7-重复请求的问题.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>取消请求</title>
</head>
<body>
    <button>点击发送请求</button>
    <script>
        //获取元素对象
        const btns = document.querySelectorAll('button');
        let x=null;
        //标识变量
        let isSending = false;//是否正在发送AJAX请求

        btns[0].onclick = function(){
            //判断标示变量
            if(isSending) x.abort();//如果正在发送 则取消该请求 创建一个新的请求
            x = new XMLHttpRequest();
            //修改 表示变量的值
            isSending=true;
            x.open("GET",'http://127.0.0.1:8000/delay');
            x.send();
            x.onreadystatechange = function(){
                if(x.readyState ===4){
                    //修改标识变量
                    isSending = false;
                }
            }
        }
        //取消请求abort
        btns[1].onclick = function(){
            x.abort();
        }
    </script>
</body>
</html>
//上面几段代码涉及到的js文件server.js
//1.引入express
const express = require('express');

//2.创建应用对象
const app = express();

//3.创建路由规则
// request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //设置响应体
    response.send('HELLO AJAX');
});
//可以接受任意类型的请求
app.all('/server',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //响应头
    response.setHeader('Access-Control-Allow-Headers','*');
    //设置响应体
    response.send('HELLO AJAX POST');
});
//可以接受任意类型的请求
app.all('/json-server',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //响应头
    response.setHeader('Access-Control-Allow-Headers','*');
    //响应一个数据
    const data = {
        name:'hjj'
    };
    //对对象进行字符串转换
    const str = JSON.stringify(data);
    //设置响应体
    response.send(str);
});
//针对IE缓存
app.get('/ie',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //设置响应体
    response.send('HELLO IE');
});
//延时响应
app.get('/delay',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    setTimeout(()=>{
        //设置响应体
    response.send('延时响应');
    },3000)
});
//4.监听端口启动服务
app.listen(8000,()=>{
    console.log("服务已经启动,8000 端口监听中......");
});

2 章:jQuery 中的 AJAX

2.1 get 请求

$.get(url, [data], [callback], [type])
url: 请求的 URL 地址。
data: 请求携带的参数。
callback: 载入成功时回调函数。
type: 设置返回内容格式, xml, html, script, json, text, _default
//server.js文件
//1.引入express
const express = require('express');

//2.创建应用对象
const app = express();

//3.创建路由规则
// request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //设置响应体
    response.send('HELLO AJAX');
});

//4.监听端口启动服务
app.listen(8000,()=>{
    console.log("服务已经启动,8000 端口监听中......");
});
//GET.html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AJAX GET 请求</title>
    <style>
        #result{
            width: 200px;
            height: 100px;
            border: solid 1px #90b;
        }
    </style>
</head>
<body>
    <button>点击发送请求</button>
    <div id="result"></div>
    <script>
        //获取button元素
        const btn = document.getElementsByTagName('button')[0];
        const result = document.getElementById("result");
        //绑定事件
        btn.onclick = function(){
            //1.创建对象
            const xhr = new XMLHttpRequest();
            //2.初始化 设置请求方法和url
            xhr.open('GET','http://127.0.0.1:8000/server?a=100&b=200&c=300');
            //3.发送
            xhr.send();
            //4.事件绑定 处理服务器返回的结果
            //on when 当。。。的时候
            //readystate 是 xhr对象中的属性,表示状态0 1 2 3 4
            //change 改变
            xhr.onreadystatechange = function(){
                //判断(服务器返回了所有的结果)
                if(xhr.readyState === 4){
                    //判断响应状态码 2xx就是成功的状态
                    if(xhr.status >= 200 &&xhr.status < 300){
                        //处理结果 行 头 空行 体
                        //1.响应行
                        // console.log(xhr.status);//状态码
                        // console.log(xhr.statusText);//状态字符串
                        // console.log(xhr.getAllResponseHeaders());//所有响应头
                        // console.log(xhr.response);//响应体
                        result.innerHTML = xhr.response;
                    }
                }
            }

        }
    </script>
</body>
</html>

2.2 post 请求

$.post(url, [data], [callback], [type])
url: 请求的 URL 地址。
data: 请求携带的参数。
callback: 载入成功时回调函数。
type: 设置返回内容格式, xml, html, script, json, text, _default
//server.js文件
//1.引入express
const express = require('express');

//2.创建应用对象
const app = express();

//3.创建路由规则
// request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //设置响应体
    response.send('HELLO AJAX');
});

app.post('/server',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //设置响应体
    response.send('HELLO AJAX POST');
});

//4.监听端口启动服务
app.listen(8000,()=>{
    console.log("服务已经启动,8000 端口监听中......");
});

//POST.html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AJAX POST 请求</title>
    <style>
        #result{
            width: 200px;
            height: 100px;
            border: solid 1px #903;
        }
    </style>
</head>
<body>
    <div id="result"></div>
    <script>
        //获取元素对象
        const result = document.getElementById("result");
        //绑定事件
        result.addEventListener("mouseover",function(){
            //1.创建对象
            const xhr = new XMLHttpRequest();
            //2.初始化 设置请求方法和url
            xhr.open('POST','http://127.0.0.1:8000/server');
            //3.发送
            xhr.send('a=100&b=200&c=300');
            //4.事件绑定 处理服务器返回的结果
            xhr.onreadystatechange = function(){
                //判断(服务器返回了所有的结果)
                if(xhr.readyState === 4){
                    //判断响应状态码 2xx就是成功的状态
                    if(xhr.status >= 200 &&xhr.status < 300){
                        //处理结果 行 头 空行 体
                        //1.响应行
                        result.innerHTML = xhr.response;
                    }
                }
            }
        })
        
    </script>
</body>
</html>

2.3 设置请求头信息

【open后,send前】

//server.js文件
//1.引入express
const express = require('express');

//2.创建应用对象
const app = express();

//3.创建路由规则
// request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //设置响应体
    response.send('HELLO AJAX');
});
//可以接受任意类型的请求
app.all('/server',(request,response)=>{
    //设置响应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //响应头
    response.setHeader('Access-Control-Allow-Headers','*');
    //设置响应体
    response.send('HELLO AJAX POST');
});

//4.监听端口启动服务
app.listen(8000,()=>{
    console.log("服务已经启动,8000 端口监听中......");
});
//POST.html文件修改部分

<body>
    <div id="result"></div>
    <script>
        //获取元素对象
        const result = document.getElementById("result");
        //绑定事件
        result.addEventListener("mouseover",function(){
            //1.创建对象
            const xhr = new XMLHttpRequest();
            //2.初始化 设置请求方法和url
            xhr.open('POST','http://127.0.0.1:8000/server');
            //设置请求头
            xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
            xhr.setRequestHeader('name','hjj');
            //3.发送
            xhr.send('a=100&b=200&c=300');
            //4.事件绑定 处理服务器返回的结果
            xhr.onreadystatechange = function(){
                //判断(服务器返回了所有的结果)
                if(xhr.readyState === 4){
                    //判断响应状态码 2xx就是成功的状态
                    if(xhr.status >= 200 &&xhr.status < 300){
                        //处理结果 行 头 空行 体
                        //1.响应行
                        result.innerHTML = xhr.response;
                    }
                }
            }
        })
        
    </script>
</body>

3 章:跨域

3.1 同源策略

同源策略 (Same-Origin Policy) 最早由 Netscape 公司提出,是浏览器的一种安全策略。
同源: 协议、域名、端口号 必须完全相同。违背同源策略就是跨域。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>同域请求</title>
</head>
<body>
    <h1>hjj</h1>
    <button>点击获取用户数据</button>
    <script>
        const btn = document.querySelector('button')
        btn.onclick = function(){
            const x = new XMLHttpRequest();
            //因为这里是同域问题,所以url可以简写
            x.open("GET",'/data');
            //发送
            x.send();
            //检查状态
            x.onreadystatechange = function(){
                if(x.readyState === 4){
                    if(x.status >= 200 && x.status < 300){
                        console.log(x.response);
                    }
                }
            }
        }
        
    </script>
</body>
</html>
//server.js
const express = require('express');
const app = express();
app.get('/home',(request,response)=>{
    //响应一个页面
    response.sendFile(__dirname+'/index.html');
});
app.get('/data',(request,response)=>{
    response.send('用户数据');
});
app.listen(9000,()=>{
    console.log("服务已经启动...");
});

3.2 如何解决跨域

3.2.1 JSONP

1.JSONP 是什么
JSONP(JSON with Padding) ,是一个非官方的跨域解决方案,纯粹凭借程序员的聪明才智开发出来,只支持 get 请求。
2.JSONP 怎么工作的?
在网页有一些标签天生具有跨域能力,比如: img link iframe script
JSONP 就是利用 script 标签的跨域能力来发送请求的
3. JSONP 的使用
27.尚硅谷_AJAX-jsonp的实现原理_哔哩哔哩_bilibili
1. 动态的创建一个 script 标签
        var script = document.createElement("script");
2. 设置 script src ,设置回调函数
        script.src = "http://localhost:3000/testAJAX?callback=abc";
        function abc(data) {
                alert(data.name);
        };
3. script 添加到 body
        document.body.appendChild(script);
4. 服务器中路由的处理
        router.get("/testAJAX" , function (req , res) {
        console.log("收到请求 ");
        var callback = req.query.callback;
        var obj = {
                name:"孙悟空",
                age:18
        }
        res.send(callback+"("+JSON.stringify(obj)+")");
        });
4.jQuery 中的 JSONP
<!DOCTYPE html >
< html lang= "en" >
< head >
        < meta charset= "UTF-8" >
        < title >Title</ title >
</ head >
< body >
        < button id= "btn" > 按钮 </ button >
        < ul id= "list" ></ ul >
        < script type= "text/javascript" src= "./jquery-1.12.3.js" ></ script >
        < script type= "text/javascript" >
                window .onload = function () {
                        var btn = document . getElementById ( 'btn' )
                        btn .onclick = function () {
$ . getJSON ( "http://api.douban.com/v2/movie/in_theaters?callback=?" , function
(data) {
console . log (data);
// 获取所有的电影的条目
var subjects = data.subjects;
// 遍历电影条目
for ( var i = 0 ; i < subjects . length ; i ++){
$ ( "#list" ). append ( "<li>" +
subjects [ i ].title+ "<br />" +
"<img src= \" " + subjects [ i ].images.large+ " \" >" +
"</li>" );
}
});
}
}
</ script >
</ body >
</ html >

3.2.2 CORS

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
30.尚硅谷_AJAX-设置CORS响应头实现跨域_哔哩哔哩_bilibili
1.CORS 是什么?
CORS Cross-Origin Resource Sharing ),跨域资源共享。 CORS 是官方的跨域解决方案,它的特点是不需要在客户端做任何特殊的操作,完全在服务器中进行处理,支持get 和 post 请求。
跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。
2.CORS 怎么工作的?
CORS 是通过设置一个响应头来告诉浏览器,该请求允许跨域,浏览器收到该响应以后就会对响应放行。
3.CORS 的使用
主要是服务器端的设置:
        router.get("/testAJAX" , function (req , res) {
                //通过 res 来设置响应头,来允许跨域请求
                //res.set("Access-Control-Allow-Origin","http://127.0.0.1:3000");
                res.set("Access-Control-Allow-Origin","*");
                res.send("testAJAX 返回的响应");
        });

 4.安装nodemon报错记录

PS C:\Users\jinju\Desktop\前端学习\练习版本\AJAX\原生AJAX> Get-ExecutionPolicy
Restricted
PS C:\Users\jinju\Desktop\前端学习\练习版本\AJAX\原生AJAX> Set-ExecutionPolicy RemoteSigned
PS C:\Users\jinju\Desktop\前端学习\练习版本\AJAX\原生AJAX> nodemon server.js  
[nodemon] 3.1.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,cjs,json
[nodemon] starting `node server.js`
node:internal/modules/cjs/loader:1137
  throw err;
  ^

Error: Cannot find module 'express'
Require stack:
- C:\Users\jinju\Desktop\前端学习\练习版本\AJAX\原生AJAX\server.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1134:15)
    at Module._load (node:internal/modules/cjs/loader:975:27)
    at Module.require (node:internal/modules/cjs/loader:1225:19)
    at require (node:internal/modules/helpers:177:18)
    at Object.<anonymous> (C:\Users\jinju\Desktop\前端学习\练习版本\AJAX\原生AJAX\server.js:2:17)
    at Module._compile (node:internal/modules/cjs/loader:1356:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1414:10)
    at Module.load (node:internal/modules/cjs/loader:1197:32)
    at Module._load (node:internal/modules/cjs/loader:1013:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:128:12) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ 'C:\\Users\\jinju\\Desktop\\前端学习\\练习版本\\AJAX\\原生AJAX\\server.js' ]
}

Node.js v18.19.0
[nodemon] app crashed - waiting for file changes before starting...
npm install express
PS C:\Users\jinju\Desktop\前端学习\练习版本\AJAX\原生AJAX> npm install express

added 65 packages, and audited 66 packages in 7s

13 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
PS C:\Users\jinju\Desktop\前端学习\练习版本\AJAX\原生AJAX> nodemon server.js
[nodemon] 3.1.7
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,cjs,json
[nodemon] starting `node server.js`
服务已经启动,8000 端口监听中......

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS Next 实战卡片开发 02

HarmonyOS Next 实战卡片开发 02 卡片开发中&#xff0c;还有一个难点是显示图片。其中分为显示本地图片和显示网络图片 显示本地图片 卡片可以显示本地图片&#xff0c;如存放在应用临时目录下的图片。路径比如 /data/app/el2/100/base/你的项目boundleName/temp/123.png 以…

将文字转换为运动:使用AMD GPU生成视频指南

Transforming Words into Motion: A Guide to Video Generation with AMD GPU — ROCm Blogs 发布日期: 2024年4月24日 作者: Douglas Jia 本博客介绍了通过增强稳定扩散模型在文本到视频生成方面的进展&#xff0c;并展示了使用阿里巴巴的ModelScopeT2V模型在AMD GPU上生成视频…

快速入门Zookeeper

Zookeeper ZooKeeper作为一个强大的开源分布式协调服务&#xff0c;扮演着分布式系统中至关重要的角色。它提供了一个中心化的服务&#xff0c;用于维护配置信息、命名、提供分布式同步以及提供组服务等。通过其高性能和可靠的特性&#xff0c;ZooKeeper能够确保在复杂的分布式…

服务器上安装Orcale数据库以及PL SQL工具(中文)

一、前期准备 1、oracle数据库安装包–>Oracle下载地址&#xff0c;版本根据当时情况就下最新的就行&#xff0c;下载时间可能有点长&#xff0c;耐心点。 2、PL SQL工具下载地址–>PL SQL下载地址&#xff0c;百度网盘可以共享【限速&#xff0c;没办法&#xff01;&am…

协程6 --- HOOK

文章目录 HOOK 概述链接运行时动态链接 linux上的常见HOOK方式修改函数指针用户态动态库拦截getpidmalloc 第一版malloc 第二版malloc/free通过指针获取到空间大小malloc 第三版strncmp 内核态系统调用拦截堆栈式文件系统 协程的HOOK HOOK 概述 原理&#xff1a;修改符号指向 …

[0342].第12节:加载与存储指令及算数指令

我的后端学习大纲 JVM学习大纲 一、加载与存储指令&#xff1a; 加载&#xff1a;主要是指的将数据压入到操作数栈中&#xff0c;那么这个数据可能来源于常量池也可能来自于局部变量表 1.iload_0占1个字节。iload 0 占3个字节。 2.因为操作码数量有限&#xff0c;只有256个&…

spark的学习-06

SparkSQL读写数据的方式 1&#xff09;输入Source 方式一&#xff1a;给定读取数据源的类型和地址 spark.read.format("json").load(path) spark.read.format("csv").load(path) spark.read.format("parquet").load(path) 方式二&#xff1a…

ODOO学习笔记(5):ODOO开发规范

一、代码结构与布局 模块结构&#xff1a; 每个ODOO模块应具有清晰的结构&#xff0c;通常包含以下目录和文件&#xff1a; models&#xff1a;存放业务逻辑相关的模型类定义&#xff0c;如定义数据库表结构、业务规则等。views&#xff1a;用于放置各种视图文件&#xff0c;包…

【性能测试】linux服务器性能监控常用命令

CPU 性能监控指令 top 命令 基本功能&#xff1a;top 命令是 Linux 系统中最常用的性能监控工具之一。它可以实时显示系统中各个进程的资源占用情况&#xff0c;包括 CPU 使用率、内存使用量、进程状态等信息。在性能测试监控服务器性能时&#xff0c;通过 top 命令可以快速查…

ROS2humble版本使用colcon构建包

colcon与与catkin相比&#xff0c;没有 devel 目录。 创建工作空间 首先&#xff0c;创建一个目录 ( ros2_example_ws ) 来包含我们的工作区: mkdir -p ~/ros2_example_ws/src cd ~/ros2_example_ws 此时&#xff0c;工作区包含一个空目录 src : . └── src1 directory, …

VUE使用TS开发打包时发现校验问题无法打包

解决办法&#xff1a; 找到 tsconfig.app.json 这个文件&#xff0c;把他的include改为一个实际存在的空文件即可

vscode+EIDE开发环境搭建

嵌入式知识框架目录篇章&#xff1a;返回请点我 热门优质文章 文章标题等级&#xff1a;低中高推荐指数5√最佳vscode安装配置使用调试【保姆级教程】中√√√[VSCODE]基于EIDE插件搭建vscode下的STM32单片机开发环境中√√√官方安装高√√√√VScode利用EIDE和cortex-debug…

kafka面试题解答(四)

5、消费者组和分区数之间的关系是怎样的&#xff1f; 消费者组数小于等于分区数&#xff0c;消费者组内每个消费者负责消费不同分区的数据&#xff0c;一个分区只能由一个组内消费者消费。 6、kafka如何知道哪个消费者消费哪个分区&#xff1f; 生产者把数据发送给各个分区&…

C#入门 020 事件(类型成员)

初步了解事件 定义:单词Event&#xff0c;译为“事件” 《牛津词典》中的解释是“a thing that happens, especially something important通顺的解释就是“能够发生的什么事情” 角色:使对象或类具备通知能力的成员 事件(event)是一种使对象或类能够提供通知的成员对象O拥有…

单链表算法题(数据结构)

1. 反转链表 https://leetcode.cn/problems/reverse-linked-list/description/ 题目&#xff1a; 看到这个题目的时候我们怎么去想呢&#xff1f;如果我们反应快的话&#xff0c;应该可以想到我们可以从1遍历到5然后依次头插&#xff0c;但是其实我们还有更好的办法&#xff…

Python 如何通过 cron 或 schedule 实现爬虫的自动定时运行

Python 如何通过 cron 或 schedule 实现爬虫的自动定时运行 自动定时运行爬虫是很多数据采集项目的基本需求。例如&#xff0c;每天采集一次新闻数据&#xff0c;或每小时更新股票行情数据等。通过 Python 实现定时任务&#xff0c;可以保证数据采集的高效和持续性。本文将带大…

初学mongoDB

MongoDB 是一个开源的 NoSQL 数据库&#xff0c;由 C 语言编写。它与传统的关系型数据库不同&#xff0c;MongoDB 使用的是一种基于文档的存储模型&#xff0c;不需要定义固定的表结构&#xff0c;可以灵活地存储和管理大量的非结构化数据。下面是 MongoDB 的一些核心特性&…

Ubuntu 的 ROS 操作系统turtlebot3环境搭建

引言 本文介绍如何在Ubuntu系统中为TurtleBot3配置ROS环境&#xff0c;包括安装和配置ROS Noetic的步骤&#xff0c;为PC端控制TurtleBot3提供操作指南。 安装和配置的过程分为PC设置、系统安装、依赖安装等部分&#xff0c;并在最后进行网络配置&#xff0c;确保PC端能够顺利…

图像增强的100种方法

文章目录 什么是图像增强 &#xff1f;一、亮度和对比度调整1.1、线性方法1.1.1、灰度反转&#xff08;Gray Inversion&#xff09;1.1.2、对比度拉伸&#xff08;Contrast Stretching&#xff09;1.1.3、对比度和亮度增强&#xff08;Contrast and Brightness&#xff09; 1.2…

Android Kotlin Flow 冷流 热流

在 Android 开发中&#xff0c;Flow 是 Kotlin 协程库的一部分&#xff0c;用于处理异步数据流的一个组件。本质上&#xff0c;Flow 是一个能够异步生产多个值的数据流&#xff0c;与 suspend 函数返回单个值的模式相对应。Flow 更类似于 RxJava 中的 Observable&#xff0c;但…