zoukankan      html  css  js  c++  java
  • 21.Nodejs基础知识(下)——2019年12月16日

    2019年10月04日16:56:23

    7. 模块

    7.1 暴露一个类,字段
    var bar = require("./bar.js");
    var msg = "你好";
    var info = "呵呵";
    
    function showInfo(){
        console.log(info);
    }
    
    exports.msg = msg;
    exports.info = info;
    exports.showInfo = showInfo;
    
    function People(name,sex,age){
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    
    People.prototype = {
        sayHello : function(){
            console.log(this.name + this.sex + this.age);
        }
    }
    
    //此时,People就被视为构造函数,可以用new来实例化了。
    module.exports = People;
    
    var People = require("./test/People.js");
    var xiaoming = new People("小明","男","12");
    xiaoming.sayHello();
    

    也就是说,js文件和js文件之间有两种合作的模式:

    1) 某一个js文件中,提供了函数,供别人使用。 只需要暴露函数就行了; exports.msg=msg;

    2) 某一个js文件,描述了一个类。 module.exports = People;

    7.2 package.json

    每一个模块文件夹中,推荐都写一个package.json文件,这个文件的名字不能改。node将自动读取里面的配置。有一个main项,就是入口文件:

    1{
    2  "name": "kaoladebar",
    3  "version": "1.0.1",
    4  "main" : "app.js"
    5}
    

    package.json文件,要放到模块文件夹的根目录去。

    7.3 __dirname 绝对路径

    新建个文件

    app.js

    里面的内容如下:

    console.log(__dirname + '/example.db');
    console.log('example.db');
    

    如果将app.js放在一个根目录下面

    执行node app.js

    分别输出如下内容:

    /Users/durban/nodejs/koa-mysql-orm-model/example.db
    example.db
    

    我们建立一个文件夹app,app下建立一个app.js

    里面的内容如下:

    console.log(__dirname + '/example.db');
    console.log('example.db');
    

    执行node app.js

    分别输出如下内容:

    /Users/durban/nodejs/koa-mysql-orm-model/app/example.db
    example.db
    

    可见,__dirname追加了自身的目录路径,一般这样做的好处是,可以避免文件的混乱调用。

    8.post请求

    8.1 原生的post请求

    把post请求的数据分成一块一块的拼接再返回。

    注意:原生写post请求比较复杂,需要写两个监听,并且上传图片等不能实现。

    var http = require("http");
    var querystring = require("querystring");
    
    
    //创建服务器
    var server = http.createServer(function(req,res){
        //如果你的访问地址是这个,并且请求类型是post
        if(req.url == "/dopost" && req.method.toLowerCase() == "post"){
            var alldata = "";
            //下面是post请求接收的一个公式
            //node为了追求极致,它是一个小段一个小段接收的。
            //接受了一小段,可能就给别人去服务了。防止一个过大的表单阻塞了整个进程
            req.addListener("data",function(chunk){
                alldata += chunk;
            });
            //全部传输完毕
            req.addListener("end",function(){
                var datastring = alldata.toString();
                res.end("success");
                //将datastring转为一个对象
                var dataObj = querystring.parse(datastring);
                console.log(dataObj);
                console.log(dataObj.name);
                console.log(dataObj.sex);
            });
        }
    });
    
    server.listen(80,"127.0.0.1");
    
    8.2 formidable模块

    上传图片文件等不能忘记这一行代码

    enctype="multipart/form-data"

    var util = require("util");
    
    //创建服务器
    var server = http.createServer(function(req,res){
        //如果你的访问地址是这个,并且请求类型是post
        if(req.url == "/dopost" && req.method.toLowerCase() == "post"){
            //Creates a new incoming form.
          
            var form = new formidable.IncomingForm();
            //设置文件上传存放地址
            form.uploadDir = "./uploads";
          
            //执行里面的回调函数的时候,表单已经全部接收完毕了。
            form.parse(req, function(err, fields, files) {
                if(err){
                    throw err;
                }
                console.log(fields);
                console.log(files);
                console.log(util.inspect({fields: fields, files: files}));
                //所有的文本域、单选框,都在fields存放;
                //所有的文件域,files
                res.writeHead(200, {'content-type': 'text/plain'});
    
                res.end("成功");
            });
        }
    });
    
    server.listen(80,"127.0.0.1");
    
    8.3 实现上传的文件改名

    fs.rename()

    //创建服务器
    var server = http.createServer(function(req,res){
        //如果你的访问地址是这个,并且请求类型是post
        if(req.url == "/dopost" && req.method.toLowerCase() == "post"){
            //Creates a new incoming form.
            var form = new formidable.IncomingForm();
            //设置文件上传存放地址
            form.uploadDir = "./uploads";
            //执行里面的回调函数的时候,表单已经全部接收完毕了。
            form.parse(req, function(err, fields, files) {
                //if(err){
                //    throw err;
                //}
                //console.log(util.inspect({fields: fields, files: files}));
    
                //时间,使用了第三方模块,silly-datetime
                var ttt = sd.format(new Date(), 'YYYYMMDDHHmmss');
                var ran = parseInt(Math.random() * 89999 + 10000);
                var extname = path.extname(files.tupian.name);
                //执行改名
                var oldpath = __dirname + "/" + files.tupian.path;
                //新的路径由三个部分组成:时间戳、随机数、拓展名
                var newpath = __dirname + "/uploads/" + ttt + ran + extname;
    
                //改名
                fs.rename(oldpath,newpath,function(err){
                    if(err){
                        throw Error("改名失败");
                    }
                    res.writeHead(200, {'content-type': 'text/plain'});
                    res.end("成功");
                });
            });
        }else if(req.url == "/"){
            //呈递form.html页面
            fs.readFile("./form.html",function(err,data){
                res.writeHead(200, {'content-type': 'text/html'});
                res.end(data);
            })
        }else{
            res.writeHead(404, {'content-type': 'text/html'});
            res.end("404");
        }
    });
    
    server.listen(80,"192.168.41.36");
    

    9.EJS 后台模板引擎

    "E" 代表 "effective",即【高效】。EJS 是一套简单的模板语言,帮你利用普通的 JavaScript 代码生成 HTML 页面。EJS 没有如何组织内容的教条;也没有再造一套迭代和控制流语法;有的只是普通的 JavaScript 代码而已。

    9.1 流程

    模板——数据——数据绑定

    var ejs = require("ejs");
    
    //模板
    var string = "好高兴啊,今天我买了iphone<%= a %>s";
    //数据
    var data = {
        a : 6
    };
    //数据绑定
    var html = ejs.render(string, data);
    //输出
    console.log(html);
    
    9.2 模板应该单独设为文件
    //app.js
    var server = http.createServer(function(req,res){
        fs.readFile("./views/index.ejs",function(err,data){
            //绑定模板
            var template = data.toString();
            var dictionary = {
                a:6,
                news : [
                    {"title":"陈伟我爱你","count":10},
                    {"title":"哈哈哈哈","count":20},
                    {"title":"逗你玩儿的","count":30}
                ]
            };
            var html = ejs.render(template,dictionary);
    
            //显示
            res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});
            res.end(html);
        });
    });
    
    server.listen(80,"127.0.0.1");
    
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <h1>好高兴啊,今天我买了一个iphone<%= a %>s</h1>
        <ul>
            <%
                for(var i = 0 ; i < news.length ; i++){
                    if(news[i].count > 15){
            %>
                    <li><%= news[i].title %></li>
            <%
                    }
                }
            %>
        </ul>
    </body>
    </html>
    

    总结:类似的还有swig,jade。jade比较难,之前使用过swig模板。

  • 相关阅读:
    代码发布一
    Qt之QThread(深入理解)
    Azure 云助手正式发布
    Qt之自定义控件(开关按钮)
    CentOS 7.x安装配置
    CSDN中的Bug
    Qt之findChild
    CentOS 6.x启动时网卡eth0未激活
    CentOS 6.x安装配置
    CentOS所有下载
  • 原文地址:https://www.cnblogs.com/oneapple/p/12050764.html
Copyright © 2011-2022 走看看