【Node.js-1】NodeJS简单入门、http、fs、url、querystring、接收客户端get/post数据

1、使用Sublime Text,最好安装一下Node这个package,安装之后不仅有代码提示这些,而且可以直接右击run,不再需要到cmd里面node xxx去执行。当然,里面的代码基本就是JS的代码。
这里写图片描述

2、先写个简单入门程序吧,在server.js文件中。

——这个代码就是简单创建一个服务器,然后挂起监听。其中判断请求里面的路径,根据请求输出不同的内容。实际开发肯定不是这么写,这边只是一个简单的例子。我们测试的时候,在浏览器中输入localhost:1337/index之类的就可以了。这里用到了我们接触的第一个模块,叫http

const http = require('http');

var server = http.createServer(function(req, res){
    switch(req.url){
        case '/index':
            res.write("This is index page.");
            break;
        case '/about':
            res.write("This is about page.");
            break;
        default:
            res.write("This is 404 page.");
            break;
    }
    res.end();
});

server.listen(1337)

3、继续补充案例。加上了读写文件。读写文件都有一个回掉函数作为参数。用到的就是文件系统模块,叫fs

——目录结构如下:
这里写图片描述

const http = require('http');
const fs = require('fs');

var server = http.createServer(function(req, res){
    var file_path = './www' + req.url;
    fs.readFile(file_path, function(err, data){
        if(err){
            res.write('404');
        }else{
            res.write(data);
        }
        // 读写文件是异步的,但读写不能再end之后,所以需要把end放在这里,保证前后执行顺序
        res.end();
    });
});

server.listen(1337)

4、接着测试从客户端接收数据的例子。我们用一个form表单,先测试用get方法。

——这是我们的目录结构。
这里写图片描述

index.html里面如截图,不展示代码了。server.js代码如下:

——核心逻辑是判断请求路径,如果是/index.html的话,就加载那个页面,如果不是的话(比如form表单的action的地址),就去处理。我们这里判断比较简单,简化了一下。

——其次,这里面是通过req.url后,然后对这个url进行各种切割,各种提取,最终把里面的参数成功放在一个叫做r的字典里面。

const http = require('http');
const fs = require('fs');

var server = http.createServer(function(req, res){
    var file_path = './www' + req.url;
    if (req.url == '/index.html') {
        // 加载页面
        fs.readFile(file_path, function(err, data){
            if (err) {

            }else{
                res.write(data);
            }
            res.end();
        });
    }else{
        // 处理结果
        r = {}
        if (req.url.indexOf('?')!=-1) {
            // /result?username=aaa&pwd=aaa
            var urlParams = req.url.split('?')[1];
            var kvs = urlParams.split('&');
            for (var i = 0; i < kvs.length; i++) {
                var temp = kvs[i].split('=');
                r[temp[0]] = temp[1];
            }
            res.write(r['username']+':'+r['pwd']);  // aaa:aaa
            console.log(r);                         // { username: 'aaa', pwd: 'aaa' }
        }
        res.end();
    }
});

server.listen(1337)

5、当然,我们会有更简单的方法,就是使用querystring模块,它的parse函数可以解析中间带有&的字符串,自动分割成一个字典。

const querystring = require('querystring');

// 处理结果
r = {};
if (req.url.indexOf('?')!=-1) {
    // /result?username=aaa&pwd=aaa
    var urlParams = req.url.split('?')[1];
    r = querystring.parse(urlParams);
    res.write(r['username']+':'+r['pwd']);  // aaa:aaa
    console.log(r);                         // { username: 'aaa', pwd: 'aaa' }
}
res.end();

6、当然,还有更简单的方法,使用url模块,它的parse方法可以解析整个url,解析之后,想要什么自己取即可。

const urlLib = require('url');

// 处理结果
r = {};
var o = urlLib.parse(req.url,true);
res.write(o.pathname+'\n'+o.query['username']+':'+o.query['pwd']);
console.log(o);
res.end();

我们可以看到,这个时候,被解析出来的o是下面这样子的。需要注意的是上面的方法后面还加了一个true参数,那么如果不加呢?不加的话,下面的query对应的值就不是字典的样子,而是用&连接起来的一个字符串,就是最原始的那个。

Url {
  protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: null,
  search: '?username=aaa&pwd=aaa',
  query: { username: 'aaa', pwd: 'aaa' },
  pathname: '/result',
  path: '/result?username=aaa&pwd=aaa',
  href: '/result?username=aaa&pwd=aaa' }

7、其实上面,我们在表单里面用了get,一般不会这样。正常情况是用post,现在我们就来看看怎么使用和接收数据。

——同样的,文件结构不变,html页面里面只不过把get变成了post而已。

——看到对于post过来的数据,因为考虑到可能有多次,所以不能直接获取,而是通过监听dataend两个事件来获取数据,基于reqdata事件,意思就是这个请求只要传数据就触发,可能会触发多次。基于reqend方法就是请求结束后触发,就触发一次。

        // 处理结果
        var str = '';
        // 数据量大的时候可能会执行很多次
        req.on('data',function(data){
            // 结果类似xxx=xxx&&yyy=yyy
            str += data;
            console.log(str);
        });
        req.on('end',function(){
            // 解析输出
            var r = querystring.parse(str);
            console.log(r);
        });
        res.end();

注意:

如果请求是get的话,用get和post两个方法都能获取到数据;但是当请求方式是post的时候,get的那个方法就获取不到数据了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值