zoukankan      html  css  js  c++  java
  • NODE编程(四)--构建Node Web程序2

    四、提供静态文件服务

      1、创建一个静态文件服务器

      __dirname ,取值是该文件所在咋目录路径。分散在不同目录中的文件可以有不同的值。

    /**
     * 最进本的ReadStream静态文件服务器
     */
    var http = require('http');
    var parse = require('url').parse;
    var join = require('path').join;
    var fs = require('fs');
    
    var root = __dirname;
    var server = http.createServer(function(req,res){
        var url = parse(req.url);
        var path = join(root,url.pathname);             //构造绝对路径
        var stream = fs.createReadStream(path);         //创建fs.ReadStream
        stream.on('data',function(chunk){                 //将文件数据写到响应中
            res.write(chunk);
        });
        stream.on('end',function(){
           res.end();
        });
    });
    server.listen(3000);

      这个文件服务器大体能用,但还有很多细节需要考虑。

      

      管道和水管:

      Node中的管道让来自源头(ReadableStream)的数据,流动到目的地(WriteableStream),我们用pipe方法把管道连接起来。

    ReadableSteam.pipe(WriteableStream);

      读取一个文件(ReadableStream)并把其中的内容写到另一个文件中(WriteableStream)用的就是管道

    var readStream = fs.createReadSteam('./original.txt')
    var writeStream = fs.createwriteStrem('./copy.tet')
    readStream.pipe(writeStream)

      所有ReadableStream都能接入任何一个WriteableStream。比如HTTP请求(req)对象就是ReadableStream.

      2、处理服务器错误

      在Node中,所有集成了EventEmitter的类都可能发出error时间。

      用fs.stat()实现先发制人的错误处理

      因为传输的文件是静态的,所以我们可以用stat()系统调用获取文件的相关信息,比如修改时间、字节数等。

    /**
     *检查文件是否存在,并在响应中提供Content-Length
     */
    
    var server = http.createServer(function(req,res){
        var url = parse(req.url);                       //解析URL以获取路径名
        var path = join(root,url.pathname);
        fs.stat(path,function(err,stat){                //检查文件是否存在
            if(err){
                if('ENOENT' == err.code){
                    res.statusCode = 404;
                    res.end('Not Found');
                }else{
                    res.setHeader('Content-Length',stat.size);  //用Stat对象的属性设置Content-Length
                    var stream = fs.createReadStream(path);
                    stream.pipe(res);
                    stream.on('error',function(err){
                        res.statusCode = 500;
                        res.end('Internal Server Error');
                    });
                }
            }
        });
    });

      

    五、从表单中接受用户输入

      1、处理提交的表单域 

      表单提交请求带的Content-Type值通常有两种

      A、application/X-www-form-urlencoded: 这是HTML表单默认值

      B、multipart/form-data: 在表单中含有文件或非ASCII或二进制数据使用。

    /**
     * 支持GET和POST的HTTP服务器.
     */
    var http = require('http');
    var items = [];
    var server = http.createServer(function(req,res){
       if('/' == req.url){
           switch (req.method){
               case 'GET':
                   show(res);
                   break;
               case 'POST':
                   add(req,res);
                   break;
               default:
                   badRequest(res);
           }
       } else{
           notFound(res);
       }
    });
    server.listen(3000);
    
    /*待办事项列表页面的表单和事项列表*/
        function show(res){
            var html = '<html><head><title>TODO LIST</title></head><body>'
                        +'<h1>TODO LIST</h1>'
                        +'<ul>'
                        +items.map(function(item){
                         return '<li>'+item+'</li>'
                         }).join('')
                        +'</ul>'
                        +'<form method="post" action="/">'
                        +'<p><input type="text" name="item" /></p>'
                        +'<p><input type="submit" value="Add Item" /></p>'
                        +'</form></body></html>';
            res.setHeader('Content-Type','text/html');
            res.setHeader('Content-Length',Buffer.byteLength(html));
            res.end(html);
        }
    
    /*notFound()函数接受响应对象,将状态吗设为404,响应主体设为Not Found*/
        function notFound(res){
            res.statusCode = 404;
            res.setHeader('Content-Type','text/plain');
            res.end('NOT FOUND');
        }
    
    /*返回400 Bad Request响应的函数实现起来跟notFound()几乎一样*/
        function badRequest(res){
            res.statuCode = 400;
            res.setHeader('Content-Type','text/plain');
            res.end('BadRequest');
        }
    /*最后还要实现add()函数,它会接受req和res连个对象*/
        var qs = require('querystring');
        function add(req,res){
            var body='';
            req.setEncoding('utf8');
            req.on('data',function(chunk){
               body += chunk;
            });
            req.on('end',function(){
                var obj = qs.parse(body);
                items.push(obj.item);
                show(res);
            });
        }
  • 相关阅读:
    XCode下Swift – WebView IOS demo
    swift-初探webView与JS交互
    Swift 实践之UIWebView
    iOS 权限判断 跳转对应设置界面
    iOS~判断应用是否有定位权限
    iOS 判断是否有权限访问相机,相册
    UIAlertController中TextField的用法
    Swift-UITextField用法
    多年iOS开发经验总结(一)
    Python lambda和reduce函数
  • 原文地址:https://www.cnblogs.com/xz1024/p/5796884.html
Copyright © 2011-2022 走看看