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模块开发

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对象

返回响应结果

其实本质上requestresponse对象,继承自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简介及应用

无法使用 NodeJS 中的 request 和 express 模块在浏览器中设置 cookie

Nodejs写的搬家工具知识分享

nodejs实现一个简单的爬虫

nodejs单页面爬虫--解决编码问题

nodejs - http.request是否有超时