nodejs的request模块问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs的request模块问题相关的知识,希望对你有一定的参考价值。
刚接触nodejs,想用request模块来请求后端的数据再用ejs画到页面上,但对request模块不太熟悉,现有一个页面上有多个地方的数据是通需要过不同链接来获取的,貌似request是异步获取到数据的,而且一个request只能读一个链接,请问如何使用request来分别获取这些链接的数据然后拼到同一个页面上呢,菜鸟求指点
我最近在研究爬虫,你这个好像跟爬虫差不多。我说一下我的方法。
要用到request模块,cheerio模块(提供像jQuery一样的具有选择器作用的函数)
request(url, function(err,res,body)if (!err && res.statusCode == 200)
var $ = cheerio.load(html); //采用cheerio模块解析html
var items = $(".repo-list li h3 a");//根据html选择器,获得链接所在的html元素
items.each(function(index, item) //如果获得了多个元素,则遍历每个元素
var src = item.attribs.href";//将每个链接提取出来
searchHref($, src);//再分别对每个链接,进行操作
);
);
function downloadZip($, src)
request(src)
//获取每个链接的数据,这是你自己的操作了
参考技术A 这个问题原因在于window7的IIS默认用的是ASP.NET v4.0应用程序池。 解决方法:新建一个ASP.NET v2.0的应用程序池。把vs2008的网站建在这个ASP.NET v2.0的应用程序池上就可以解决这个问题。
NodeJS中http模块开发
NodeJS中http模块开发
web服务器初体验
两种创建方式
const http = require("http");
// 创建方式一 http.createServer
const server1 = http.createServer((request, response) => {
response.end("hello server1");
});
// 设置监听端口
server1.listen(8080, "0.0.0.0", () => {
console.log("服务器开启成功~");
});
// 创建方式二 http.Server类
const server2 = new http.Server((request, response) => {
response.end("hello server2");
});
server2.listen(8081, "0.0.0.0", () => {
console.log("服务器开启成功~");
});
浏览器请求效果
其他补充
// server方式可以不传端口和主机host
server.listen(() => {
console.log(server.address().port);// 获取默认设置的端口
});
request对象
method的处理
根据Restful风格,增删给查对应不同得请求方式
- GET:查询数据
- POST:新增数据
- PATCH:修改数据
- DELETE:删除数据
// 不同的请求方式打印结果不同 可能结果 GET/POST/PATCH/DELETE
console.log(request.method);
url的处理
GET请求处理
携带的参数一般是放在URL上,如Get请求:http://localhost:8080/login?username=fzb&password=123456
如何进行解析
const url = require("url");
const qs = require("querystring");
//省略大部分代码......
const { pathname, query } = url.parse(request.url);
const { username, password } = qs.parse(query);
console.log(pathname, username, password); // /login fzb 123456
POST请求处理
POST请求数据一般是放在请求体body里面的,POST请求可以添加文件,那么不可能一个请求就可以把数据完整传过去,那么就需要采用流
的方式接收
var result = "";
// request.setEncoding("utf-8");
request.on("data", (data) => {
console.log(data); // 结果是Buffer类型的数据,如果想对传过来的数据直接转换,取到的data直接是解码好的, 上方加入 request.setEncoding("utf-8");
result += data; // 字符串拼接时自动调用toString转换了
});
// 同时还可以监听end事件,一样的效果
request.on("close", () => {
console.log(result);
console.log("数据传送完成~,结果是:", result);
const { username, password } = JSON.parse(result);
console.log(username, password); // fzb 123456
});
headers的处理
console.log(request.headers);
// {
// 'content-type': 'application/json',
// 'user-agent': 'PostmanRuntime/7.28.4',
// accept: '*/*',
// 'postman-token': '3f6f73e9-c26b-495b-a18e-99b5dfed16d6',
// host: 'localhost:8080',
// 'accept-encoding': 'gzip, deflate, br',
// connection: 'keep-alive',
// 'content-length': '50'
// }
content-type
:请求携带的数据类型
- application/json:请求携带的数据是json类型的
- application/xml:请求携带的数据是xml类型的
- text/plain:请求携带的数据是文本类型的
- multipart/formdata:请求携带文件
user-agent
:客户端的信息
accept
:客户端可以接收的文件类型
token
:token数据可以放在headers内
accept-encoding
:客户端可以接受的编码方式
connection:keep-alive
,请求结束后默认保持连接,保持连接的时间是有限的,Node内是5s
content-lenght
:携带数据的长度(大小)
response对象
返回响应结果
其实本质上request
和response
对象,继承自Stream,那么返回响应结果,这样操作:
response.write("write方法");
response.end("hello server");
但是response
却没有了close方法
,结束响应结果只能用 end
。
返回状态码
告诉客户端本次请求的状态,返回对应的状态码
常见状态码
200
:请求成功3xx
:请求重定向400
:客户端错误,发送请求的语法存在错误401
:客户端权限不够403
:服务器拒绝服务404
:无法请求到资源,一般是url地址问题5xx
:服务器端错误
response.statusCode = 200;
// 或
response.writeHead(200);
响应头文件
告诉客户端请求相关信息
// 方法一:response.setHeader 一条一条设置
response.setHeader("Content-type", "application/json;chartset=utf8");
// 方法二:对象式设置响应头
response.writeHead(200, {
"Content-type": "application/json;chartset=utf8",
});
例子:响应结果<h1>Http</h1>
,浏览器接收时当字符串处理,但是想要其自动当html进行解析,该怎么做:响应头设置浏览器如何解析(Content-type
)
response.writeHead(200, {
"Content-type": "text/html;chartset=utf8",
});
response.end("<h1>http</h1>");
当html进行解析,该怎么做:响应头设置浏览器如何解析(Content-type
)**
response.writeHead(200, {
"Content-type": "text/html;chartset=utf8",
});
response.end("<h1>http</h1>");
浏览器响应展示
http模块发送网络请求
http模块除了可以用来开发服务器,还可以用来做网络请求~
发送GET请求
const http = require("http");
http.get(
{
host: "localhost",
path: "/login",
port: 8080,
},
(res) => {
let result = "";
res.on("data", (data) => {
result += data;
});
res.on("end", () => {
console.log(result);
});
}
);
发送POST请求
http没有post方法,只能通过request方法手动指定请求的方法。
发送完成之后,需要手动将本次请求结束。
const req = http.request(
{
host: "localhost",
path: "/login",
port: 8080,
method: "POST",
},
(res) => {
let result = "";
res.on("data", (data) => {
result += data;
});
res.on("end", () => {
console.log(result);
});
}
);
req.end();
以上是关于nodejs的request模块问题的主要内容,如果未能解决你的问题,请参考以下文章
nodejs入门教程之http的get和request简介及应用