zoukankan      html  css  js  c++  java
  • node.js表单——formidable

    node处理表单请求,需要用到formidable包。安装formidable包的命令如下:

    npm install formidable

    安装package的路径分为两种,一种是本地目录,一种是全局目录。

    npm install xxx -g 命令将模块下载安装到全局目录中。

    全局目录可以通过 npm config set prefix "目录路径" 来设置。

    通过 npm config get prefix 来获取当前设置的目录。

    npm install xxx ,则是将模块下载到当前命令行所在目录。

    关于package安装路径的说明网上是像上面那样说的,但我不执行全局安装的时候,formidable被安装在了用户主目录/home/用户名/node_modules下面,而不是安装在命令行所在目录,我用的ubuntu版本是14.04,原因不太清楚。安装在本里目录和全局目录到底哪个好,我认为各有优势。这里就不赘述了。

    安装完formidable之后,一个标准的node project,应该有一个index.js文件,用于定义怎么处理来自浏览器的request,index.js代码如下:

    var http = require("http");//获取http对象
    var url = require("url");//获取url对象
    //http、url都是系统自带的模块,而下面的requestHandlers是我们手动编写的模块,对应当前目录下的requestHandlers.js文件
    var requestHandlers = require("./requestHandlers");
    
    //onRequest函数,用于处理http请求,不同的url请求交由不同的函数进行处理
    function onRequest(request, response){
        var pathname = url.parse(request.url).pathname;//获取请求的URL
    
        //requestHandlers的handle属性又是一个对象,该对象包含多组属性:属性值,属性名对应uri,属性值对应处理函数,详见requestHandlers.js
        if(typeof requestHandlers.handle[pathname] === "function")
            requestHandlers.handle[pathname](request, response);
        else {
            console.log("No request handler found for " + pathname);
            response.writeHead(404, {"Content-Type": "text/html;charset=utf-8"});
            response.write("您访问的页面不存在!访问<a href='/'>首页</a>");
            response.end();
        }
    }
    
    var server = http.createServer(onRequest);//函数onRequest作为createServer的参数,这样浏览器每发送一次请求,服务器中该函数都会被调用一次
    server.listen(8888);
    //上面两句可以合写成http.createServer(onRequest).listen(8888);

    上面这段代码几乎可以成为大部分node项目的index的模板,有改动也不会很大,如果给应用增加功能,只需要更改后面的requestHandlers.js文件。以前上学时老师讲的一个基本node应用分为index.js、server.js、router.js和requestHandlers.js四个部分,而server.js和router.js的代码从来都是不需要改变的,可以应用到任何一个项目,后来我发现其实前三个部分可以整合到一起,于是自己琢磨了一下写出了上面那个index.js,后来发现整合之后其实还好理解一点。

    下面贴出requestHandlers.js的代码:

    var handle = {};
    var formidable = require("formidable");
    
    handle["/"] = start;
    handle["/start"] = start;
    handle["/upload"] = upload;
    
    function start(request, response) {
      var body = '<html>'+
        '<head>'+
        '<meta http-equiv="Content-Type" content="text/html; '+
        'charset=UTF-8" />'+
        '</head>'+
        '<body>'+
        '<form action="/upload" method="post">'+
        '学号:<input type="text" name="id" /><br /><br />'+
        '姓名:<input type="text" name="name" /><br /><br />'+
        '<input type="submit" value="提交" />'+
        '</form>'+
        '</body>'+
        '</html>';
        response.writeHead(200, {"Content-Type": "text/html"});
        response.write(body);
        response.end();
    }
    
    function upload(request, response) {
        var form = new formidable.IncomingForm();
        form.parse(request, function(error, fields, files) {
        console.log("id:" + fields.id);
        console.log("name:" + fields.name);
        response.writeHead(200, {"Content-Type": "text/html;charset=utf-8"});
        response.write("id:" + fields.id + "<br>");
        response.write("name:" + fields.name);
        response.end();
        });
    }
    
    exports.handle = handle;
    exports.start = start;
    exports.upload = upload;

    上面演示了一个form表单提交后,从form表单中提取信息的例子。其中handle是一个对象,包含多组属性和属性值,属性名对应url,属性值对应处理函数,即请求的url与函数是一一对应的,浏览器每发送一个请求,服务器分析出请求的url,并用handle中名为该url的属性的值所对应的函数来处理该请求。比如,浏览器发送了一个请求,uri为/upload,服务器查找到handler中,handler["/upload"] = upload,就会调用upload函数来处理该请求。模块中所有可能会被外部文件调用属性、函数都需要使用exports命令导出,如requestHandlers.js的结尾部分。所以,如果增加功能时,页面上增加了一个链接或表单之类的请求/xxx,则通常需要在requestHandlers.js文件中作出修改,分三步:

    一、增加 handler["/xxx"] = xxx;

    二、增加 function xxx(request, response){...};

    三、增加 exports.xxx = xxx;

  • 相关阅读:
    基于代码驱动:处理有依赖关系接口
    Jenkins部署git+python项目实现持续集成
    jenkins安装和邮件配置
    单元测试unittest(基于数据驱动的框架:unittest+HTMLTestRunner/BeautifulReport+yaml+ddt)
    装饰器做权限认证
    jquery + ajax 提交数据报错
    前端添加复选框checkbox 提交到django后台处理
    django的自定义权限
    代码发布系统实现思路
    Django (二) 常用字段及 ORM
  • 原文地址:https://www.cnblogs.com/dige1993/p/4641822.html
Copyright © 2011-2022 走看看