Skip to content

huangbiyong/node

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 

Repository files navigation

image

node,npm,express 启动

1. node启动

  • 创建 index.js 或 app.js 文件,作为入口文件;
  • 使用 npm init 初始化项目,创建package.json文件;
  • 使用 npm install express --save 安装需要的模块;
  • 使用 node index.js(app.js) 就可以启动node 项目;

2. npm启动

  • 创建 index.js 或 app.js 文件,作为入口文件;
  • 使用 npm init 初始化项目,创建package.json文件;
  • 使用 npm install express --save 安装需要的模块;
  • 在 package.json 的 scripts 添加 "start": "node app.js"
  • 使用 npm start 就可以启动;

3. express启动

  • 使用 npm install express-generator -g ;
  • 使用 express projectName 得到一个express 生成的项目结构;
  • 使用 npm start 启动

常见问题

  1. 使用这个指令,没有出现node_modulesw文件夹,由于是全局安装,所以只会安装在node 的安装目录,需要使用 npm install express --save;
  2. npm install express 是默认在package.json 添加依赖库,要想在开发环境下添加(devDependencies),需要使用npm install express --save--dev

node的基础

1.创建简单的node 服务

创建一个项目文件夹,例如myapp, 创建index.js文件,执行npm init

  • 使用var http = require("http");引用http模块;
  • 创建服务http.createServer;
  • 使用listen监听和启动服务;
  • 在回调中设置响应res
var http = require("http");

var server = http.createServer(function (req,res) {
    res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"});
    console.log("Hello world");
    res.end("Hello world");

});

server.listen(3000,"localhost");

执行 node index.js,在浏览器打开 http://localhost:3000/ image

2.req.url 返回不同的数据

var http = require("http");

var server = http.createServer(function (req,res) {

    console.log("服务器接收到了请求,地址为:" + req.url);

    if(req.url == "/home") {
        res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"});
        res.end("<h1>主页</h1>");
    }else if(req.url == "/nav") {
        res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"});
        res.end("<h1>导航</h1>");
    }}else {
        res.writeHead(404,{"Content-type":"text/html;charset=UTF-8"});
        res.end("<h1>页面不存在</h1>");
    }
});

server.listen(3000,"127.0.0.1");

3.静态文件的渲染

  • 首先创建一个home.html的文件,并创建home.css的css文件;
  • 使用var fs = require("fs"); fs.readFile来获取文件,并返回;
  • readFile 函数的第一个参数为文件路径,第二个参数为回调函数,当获取成功后,将回调该方法;

index.js文件:

var http = require("http");
var fs = require("fs");

var server = http.createServer(function (req,res) {
    if (req.url == "/home") {
        fs.readFile("./home.html",function(err,data){
            res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"});
            res.end(data);
        });
    }else if(req.url == "/pulic/home.css") {
        fs.readFile("./resource/css.css",function (err,data) {
            res.writeHead(200,{"Content-type":"text/css"});  //不是UTF-8
            res.end(data);
        });
    }else {
        res.writeHead(404,{"Content-type":"text/html;charset=UTF-8"});
        res.end("请求地址资源不存在");
    }
});

server.listen(3000,"127.0.0.1");

上面代码中,由于css文件也是需要请求的,所以必须在使用readFile返回

4. req 相关参数和方法

   例如:请求http://localhost:3000/home?name=chase&age=22

  • req包含用户请求的相关参数,使用var url = require("url"); 可以将参数字符串转换为对象;
  • req.url     输出: /home?name=chase&age=22
  • url.parse(req.url).query     输出: name=chase&age=22
  • url.parse(req.url, true).query     输出: { name: 'chase', age: '22' }
  • url.parse(req.url, true).query.name     输出: chase

5. 文件,文件夹的相关操作

  • 文件夹的子文件遍历,fs的readdir可以遍历一个指定的文件夹;
  • fs.stat 可以读取指定文件的相关信息,stats.isDirectory()可以判断是否是文件夹,stats.isFile()判断是否是文件;
   例如:photoName 为uploads下的images文件夹 (photoName = "images")
        
   var path = require("path"); 模块的extname函数能获取到文件格式,返回如 “.jpg  .png”

   fs.readdir("./uploads/" + photoName,function(err,files){
        if(err){
            //callback("没有找到Uploads文件",null);
            return;
        }

        var allImages = [];
        (function iterator(i){    //循环实现全部子文件的遍历
            if(i == files.length){
                //结束了
                //callback(null,allImages);
                return;//所有的除了报错可以不写也没关系,其他的时候一定记得加上
            }
            //uploads/当前点击的“相册文件夹”/相册文件
            fs.stat("./uploads/" + photoName + "/" + files[i],function(err,stats){
                if(err){
                    throw err;
                }
                /*
                    如果需要整个全部显示,那么你判断是否是图片或文件夹,如果二者满足其一,则push到allImages数组,
                */
                if (stats.isDirectory()) {
                    allImages.push({name: files[i],isDire:true, path:"./uploads/" + files[i]});
                }else {
                    var extname = path.extname(files[i]).toLowerCase();
                    if (extname == ".jpg" || extname == ".png" || extname == ".jpeg" || extname == ".gif" || extname == ".bmp") {
                        allImages.push({name: files[i], isDire:false, path:"uploads/" + files[i]});
                    }
                }
                iterator(i+1);
            });
        })(0);

    });

6. 模块的创建,require,exports,module.exports

  • 创建foo.js后,定义了name,age等相关属性,外界如何获得并使用foo的信息,通过使用exports 来向外部暴露相关的方法和属性即可;
此为foo.js文件:


var name = "chase";
var age = 20;

var obj = {
    name: name,
    age: age
}

console.log("已经执行");
exports.obj = obj;  // 向外暴露信息

------------------------------------------------------------

此为index.js 文件进行调用: 

var foo = require("./public/foo.js");
console.log(typeof foo);     //object     对象
console.log(foo.obj.name);
  • 创建一个类,并且引用

此为 people.js文件:

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);
    }
}

module.exports = People;  //暴露一个方法(类)

-------------------------------------------------------------

此为index.js 文件进行调用: 


var people = require("./public/people");
console.log(typeof people);  //function   方法(类)

var chase = new people("chase","男",20);
console.log(chase.name);

7. 日期格式化

  • 引用require("silly-datetime") 模块,可以对日期进行格式化处理;
/*
    format:两个参数
    第一个:时间对象,就是你需要格式化的字符对象
    第二个:传入你需要指定的时间格式

    year:年
    month:月
    day:天
    hour:小时
    Minute:分钟
    second: 秒

    Y:年   M:月   D:日   H:小时  m:分钟(小写), s: 秒(小写)
*/

var sd = require("silly-datetime");

var newDate = sd.format(new Date(),"YYYY-MM-DD HH:mm");
console.log(newDate);  // 输出: 2017-11-27 15:43

var newDate1 = sd.format(new Date(),"YYYY-MM-DD HH:mm:ss");
console.log(newDate1); // 输出: 2017-11-27 15:43:47

8. post 数据请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>表单提交  动脑学院作业</title>
    <link rel="stylesheet" href="css/master.css"/>
</head>
<body>
    <div class="wrapper">
        <div class="title">注册中心
            <span class="title-status"><a href="index.html">返回相册</a></span>
        </div>
        <form class="form"   action="http://localhost:3000/dopost" method="post">
            <ul>
                <li><input type="text" name="name" placeholder="请输入您的名字" class="txt"/></li>
                <li><input type="password" name="password" placeholder="请输入您的密码" class="txt"/></li>
                <li><input type="submit" placeholder="" class="btn"/></li>
            </ul>
            <div class="cl"></div>
        </form>
    </div>
</body>
</html>
  • 创建form.js进行,实现服务接收数据
var http = require("http");
var querystring = require("querystring"); 
//将参数 & 字符串转换对象, 
//如 “name=hello&password=123456” --> {name:"hello",password:"123456"}

var server = http.createServer(function (req, res) {
    
	if (req.url == "/dopost" && req.method.toLowerCase() == "post") {

		var allData = "";
		req.addListener("data",function(chunk){
			allData += chunk;  //数据是分段接收的
		});

		req.addListener("end",function () {
            console.log(typeof allData);   //输出 string
			console.log(allData); //输出 name=hello&password=123456

			var dateString = allData.toString();
			var dataObj = querystring.parse(dateString)
			console.log("name: "+dataObj.name);  // 输出 name: hello

			res.end("success");
        });
	}
});

server.listen(3000,"127.0.0.1");

9. 上传文件或图片

  • 引用 var formidable = require("formidable");
  • 创建 IncomingForm对象;var form = new formidable.IncomingForm();
  • 设置 uploadDir属性,即文件接收收保存的目标文件夹, form.uploadDir = "./static/images;
  • form.parse 实现接收成功回调;
  • 可以使用fs.rename 来进行文件的重命名和移动;
var formidable = require("formidable");
var http = require("http");
var util = require("util");
var path = require("path");
var sd = require("silly-datetime");
var fs = require("fs");

http.createServer(function (req, res) {
    if (req.url == "/upload" && req.method.toLowerCase() == "post") {
        var form = new formidable.IncomingForm(); //创建IncomingForm对象
        form.uploadDir = "./static/images";  //保存的路径

       /*
          fields: 提交的基本数据(name: username, age)
          files: 提交的文件数据 (name: upload)
       */

        form.parse(req, function (err, fields, files) {
            res.writeHead(200, {"Content-type":"text/plain"});
            res.write("received upload:");

            var ran = parseInt((Math.random()*10000).toFixed(0));
            var newDate = sd.format(new Date(), "YYYYMMDDHHmmss");
            var extname = path.extname(files.upload.name);
            var oldpath = __dirname + "/" + files.upload.path;
            var newpath = __dirname + "/static/images/" + newDate + ran + extname;

            console.log("__dirname: " + __dirname); //  /Users/chase/Pictures/MyCodes/codes
            console.log("oldpath: " + oldpath);     //  /Users/chase/Pictures/MyCodes/codes/static/images/upload_ce6324572d05a4270d3cf20259f45f27


            //不同路径下的文件更名 + 移动(这里文件已经在/static/images下,只是对其进行重命名)
            fs.rename(oldpath,newpath,function (err) {
                if (err) {
                    throw Error("失败");
                }
                res.writeHead(200, {"Content-type": "text/plain"});
                res.end("success");
            });

            res.end(util.inspect({fields:fields, files: files}));
        });

        return;
    }

    //表示get请求时,获取渲染html文件
    res.writeHead(200, {"Content-type":"text/html"});
    res.end(
        '<form action="/upload" enctype="multipart/form-data" method="post">'+
        '<input type="text" name="username"><br>'+
        '<input type="text" name="age"><br>'+
        '<input type="file" name="upload" multiple="multiple"><br>'+
        '<input type="submit" value="Upload">'+
        '</form>'
    )

}).listen(3000);

10. ejs的使用

  • ejs 是能动态渲染到html,使html看起来更生动和实用
  • 实用 npm install ejs --save 安装ejs
  • 引用 var ejs = require("ejs");
  • 创建 index.ejs 文件,用来显示;
  • 创建 ejs.js 设置index.ejs数据;
index.ejs文件:   

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>


</head>
<body>

    <div> num的值 <%= num %></div>
    <ul>

        <%
            for(var i=0;i<list.length;i++){
                if(list[i].age < 20){

        %>
               <li>
                   <span style="color:red;"><%= list[i].title %></span>
                   <span style="color:green;"><%= list[i].age %></span>
               </li>
        <%
               }
            }
        %>

    </ul>

</body>
</html>
ejs.js 文件:


var http = require("http");
var fs = require("fs");
var ejs = require("ejs");

http.createServer(function (req, res) {

    fs.readFile("./views/index.ejs", function (err,stats) {

        var template = stats.toString();
        var data = {
            num: 1,
            list:[
                {
                    title:"Hello1",
                    age:18
                },
                {
                    title:"Hello2",
                    age:19
                },
                {
                    title:"Hello3",
                    age:20
                }
            ]
        }

        var html = ejs.render(template,data);

        console.log("stats: " + typeof stats);
        console.log("template: " + typeof template);
        console.log("html: " + typeof html);

        console.log(stats);
        console.log(html);

        res.writeHead(200,{"Content-type":"text/html;charset=UTF-8"});
        res.end(html);

    });

}).listen(3000,"127.0.0.1");
  • 使用fs.readFile获取文件,将文件转化为字符串var template = stats.toString()模版;
  • ejs.render 方法是将数据渲染到模版中,第一个参数为文件模版字符串,第二个参数为数据对象;
  • 然后设置响应返回 res.end(html);

express 学习

1. express use 和 get 的区别

  • 同一个路由,例如apple,use可以访问apple/news....下面所有的路由,而get不行
  • use 可以设置静态资源文件app.use(express.static("./public"));
  • use 不考虑http的请求方法;
 如果path 设置为’/’,则 
 GET / 
 PUT /foo 
 POST /foo/bar
 均是中间件的作用范围

koa 学习

1. koa 和 express 的区别

官网:http://www.koacn.com/ 
开发团队:Express原班人马
Express弱点:不能忍的callback(函调函数)
优点:可以免除重复繁琐的回调函数嵌套,并极大地提升常用错误处理效率
node版本建议:v7.6.0以上
特点:是为ES6而生的,并非ES5,

需要使用npm install koa --save 来安装koa

2. koa 的基础应用

var Koa = require("koa");
var app = new Koa();

//context
var home = function (ctx) {
    //ctx.request  表示请求
    //ctx.response 表示http 响应

    //ctx.response.body属性就是发送给用户得内容

    console.log(ctx);
    ctx.response.type = "html";
    ctx.response.body = "hello"
}

//模糊匹配   和 express .use 相似
app.use(home);
app.listen(3000);
  • 首先引用koa模块require("koa");
  • 创建koa对象;
  • 使用use进行回调,与express .use 方法相似,都是模糊匹配;
  • 调用listen进行监听和开始服务;
  • 回调方法中有两个参数,ctx(上下文) ,next(下一个中间件);
  • ctx.response.body 属性就是发送给用户得内容,将会显示在浏览器中;
  • ctx.response.type 设置响应的文本类型;

3.koa 读取静态文件

使用 fs.createReadStream 流的方式进行读取

var Koa = require("koa");
var app = new Koa();
var fs = require("fs");

var main = function (ctx) {
    //返回文件
    /*
       不能使用fs.readFile
    */
    ctx.response.type = "html";
    ctx.response.body = fs.createReadStream("./template.html");
}

app.use(main);

app.listen(3000);

4.koa route绝对匹配

使用koa-route 模块,可以进行get,post 等方式的路由绝对匹配,如果不实用route模块,直接进行use调用,则为相对匹配。

var Koa = require("koa");
var app = new Koa();
var route = require("koa-route");

// 实现 get 路由

var home = function (ctx) {
    ctx.response.type = "html";
    ctx.response.body = "welcome to home";

}

var other = function (ctx) {
    ctx.response.type = "html";
    ctx.response.body = "welcome to other";
}


// 绝对匹配
app.use(route.get("/", home));
app.use(route.get("/other", other));

// 相对匹配
// app.use(path, callback);

app.listen(30![image](http://note.youdao.com/favicon.ico)![image](http://note.youdao.com/favicon.ico)00);

5. koa 静态资源文件

使用koa-static 模块,把需要的设置的静态资源文件路径作为参数,然后设置use就可以了。

var Koa = require("koa");
var app = new Koa();
var koastatic = require("koa-static");
var path = require("path");

//设置静态资源
var main = koastatic(path.join(_dirname));

// 就可以访问这么目录下的所有文件
app.use(main);

app.listen(3000);

6. koa 请求重定向

在回调的响应属性redirect,设置重定向的路由;

var Koa = require("koa");
var app = new Koa();
var route = require("koa-route");

var login = function (ctx) {
    ctx.response.body = "login page"
}

var user = function (ctx) {
    ctx.response.body = "user page"
    ctx.response.redirect("/login");
    console.log("hello login");
    //重定向到 /login
}

app.use(route.get("/login",login));
app.use(route.get("/user", user));

app.listen(3000);

7. koa 中间件

koa 中间件 之间的处理是通过next()来现实的,执行next()时,将会跳转到匹配的下一个中间价,执行结束后,在回到原处,往下执行。例如以下:

var Koa = require("koa");
var app = new Koa();

var login = function (ctx, next) {

    /*
      ctx.response.body = "login";
      next();
      浏览器显示  main


      next();
      ctx.response.body = "login";
      浏览器显示  login


      总结: 说明在执行next()时,将会跳转到匹配的下一个中间价,执行结束后,在回到原处,往下执行

     */

    next();
    ctx.response.body = "login";
    //next();
}

var main = function (ctx) {
    ctx.response.body = "main";
}

app.use(login);
app.use(main);

app.listen(3000);

About

node的从基础到项目,主要针对初学者的学习之路,持续更新........

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published