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模板。

原文地址:https://www.cnblogs.com/oneapple/p/12050764.html