NodeJs初学笔记

发布时间 2023-06-27 14:24:49作者: 脏猫

今天初步了解了 http、fs、querystring、url 四个包以及本地服务器部署的内容,记录一下。

引入包

首先需要的包要下载,使用 npm 工具,(cnpm 更快也行),npm i module 安装。

在该文件下目录下会自动生成 node_modules 文件夹,里面包含了很多模块。

const module = require('module')

http 服务器部署

首先需要创建一个服务器。

http.createServer(),参数是一个回调函数,接收请求并给出反馈。并启动 listen 监听,参数给的数字是本地服务器端口。一般不冲突就可以了。

http.createServer((req, res) => {}).listen(8080)

启动服务器

在该目录的命令行下输入 node filename.js 即可

若直接退出,可能是没有启动监听函数 listen

fs 文件系统

fs = filesystem 即 node 下的文件读写操作

需要引入 fs 模块。常用两个操作

fs.writeFile(path,data,err=>{})

fs.readFile(path,(err,data)=>{})

err 是抛出的错误,针对错误给出相应的处理。

值得注意的是,node 下文件路径如果是同级目录,前面得加上”./“。

如果和 http 协作,根据 request 来读取内容的话,比如下面的代码:

http.createServer(function(req,res){
 console.log(req.url);
 fs.readFile(`www${req.url}`,(err,buffer)=>{
  if(err){
   res.writeHeader(404);//写入错误代码
   res.write('Not Found');//写出错误提示
   res.end();
  }else{
   res.write(buffer);//没有异常则写出内容
   res.end();
  }
 })
}.listen(8080);

http 的两种请求

Get

get 请求得到头部信息,比如提交表单后在 url 中可以看到,url?username=xxxxx&password=xxxxx

这里可以用 querystring 模块来处理

http.createServer(function(req,res){
 let [url,query] = req.url.split('?');//由?分割开两部分内容
 let get = querystring.parse(query);
 console.log(url,get);
}.listen(8080);

也可以用 url 模块

http.createServer(function(req,res){
 let {pathname,query} = url.parse(req.url,true);
 console.log(pathname,query);
}.listen(8080);

Post

post 请求 body 内容,是分段传输过来的。可以同一个数组来存储数据。

还是可以用上面两个模块来实现。

http.createServer(function(req,res){
    let arr = [];
    req.on('data',buffer=>{
      arr.push(buffer);
    });
    req.on('end',()=>{
      let buffer = Buffer.concat(arr);
      let post = querystring.parse(buffer.toString());
      console.log(post);
    });
}.listen(8080);
http.createServer(function(req,res){
    let arr=[];
    req.on('data',buffer=>{
      arr.push(buffer);
    });
    req.on('end',()=>{
        let buffer = Buffer.concat(arr);
        console.log(buffer.toString());
      });
}.listen(8080);

demo

下面是一个运用上面几点实现的小例子

首先是做一个表单,在 html 文档中写入表单,method 可以改成 get 或者 post,url 后面的/aaa 也可以改掉。

<form class="" action="http://localhost:8080/aaa" method="post">
  用户:<input type="text" name="username" value="" /> 密码:<input
    type="password"
    name="password"
  />
  <input type="submit" name="" value="提交" />
</form>

再写一个 server.js

const http = require('http')
const fs = require('fs')
const querystring = require('querystring')
const url = require('url')

http
  .createServer((req, res) => {
    let path = '',
      get = {},
      post = {}

    if (req.method == 'GET') {
      let { pathname, query } = url.parse(req.url, true)

      path = pathname
      get = query
      complete(0)
    } else if (req.method == 'POST') {
      path = req.url
      let arr = []
      req.on('data', (buffer) => {
        arr.push(buffer)
      })
      req.on('end', () => {
        let buffer = Buffer.concat(arr)
        post = querystring.parse(buffer.toString())
        complete()
      })
    }
    function complete() {
      console.log(path, get, post)
    }
  })
  .listen(8080)

处理的只是最简单的请求以及提供的表单内容输出。