Node,Java自学宝典百度云

    • hello express

    • 访问静态文件

    • 上传文件

    • 更多文档

教程来源:how2j 的 node.js教程

以下所有代码都在 Gitee 上:https://gitee.com/szluyu99/how2j_front_note/tree/master/nodejs

前言

=====================================================================

how2j 的 node.js 教程 是比较容易入门的,但是并不是很深入的教程,目前 Node.js 并不是我学习的重点,其他技术对我来说更重要,因此我很适合这种快餐式的教程,大致学习一下这门技术,了解它能做什么(也就是入个门),等后面有需要时再自己翻文档深入学习。

node.js 入门

=============================================================================

所有代码:https://gitee.com/szluyu99/how2j_front_note/tree/master/nodejs

环境配置


Node.js 官网:https://nodejs.org/en/download/

分享一个 Node.js 安装教程:https://www.cnblogs.com/zwjphp/p/14123746.html

以下命令可以用于检测环境:

node --version

node -v

hello node.js


编写一个 server.js:


var http = require('http'); // 引入http模块

var url = require('url'); // 引入url模块

var querystring = require('querystring'); // 引入querystring模块



function service(request, response) {

    // 设置返回代码200, 返回格式text/plain

    response.writeHead(200, { 'Content-Type': 'text/plain' });

    // 设置返回内容

    response.end('Hello Node.js')

}



// 基于service函数来创建服务器

var server = http.createServer(servic);

// 服务器监听8088端口

server.listen(8088); 

在该脚本的目录下执行运行服务器的指令:


node server.js 

访问该 url:http://localhost:8088/

在这里插入图片描述

node.js 获取参数



var http = require('http'); // 引入http模块

var url = require('url'); // 引入url模块

var querystring = require('querystring'); // 引入querystring模块



function service(req, response) {

    //获取返回的url对象的query属性值

    var arg = url.parse(req.url).query;

    //将arg参数字符串反序列化为一个对象

    var params = querystring.parse(arg);

    //请求的方式

    console.log("method - " + req.method);

    //请求的url

    console.log("url - " + req.url);

    //获取参数id

    console.log("id- " + params.id);

    

    response.writeHead(200, { 'Content-Type': 'text/plain' });

    response.end('Hello Node.js');

}



var server = http.createServer(service);

server.listen(8088); 

访问:http://127.0.0.1:8088/?id=123

在这里插入图片描述

node.js 模块系统


编写一个 how2j.js 作为一个模块,然后在别的 js 文件中调用该模块:

how2j.js:


function service(request, response) {

    response.writeHead(200, { 'Content-Type': 'text/plain' });

    response.end('Hello how2j.j');

}



function sayHello() {

    console.log('hello from how2j.js');

}



// 允许外部通过 hi() 这个函数名称调用 sayHello() 这个函数

exports.hi = sayHello;

// 允许外部通过 service() 这个函数名称调用 service() 这个函数

exports.service = service; 

server.js:


var http = require('http');

var how2j = require('./how2j');



how2j.hi()

http.createServer(how2j.service).listen(8088); 

node.js 路由


业务处理模块 requestHandlers.js:


function listCategory() {

    return "a lot of categorys";

}



function listProduct() {

    return "a lot of products";

}



exports.listCategory = listCategory;

exports.listProduct = listProduct; 

路由模块 router.js:


function route(handle, pathname) {

    if (typeof handle[pathname] === 'function') {

        return handle[pathname]();

    } else {

        return pathname + ' is not defined';

    }

}



exports.route = route; 

服务器模块 server.js:


var http = require("http");

var url = require("url");



// handle 是一个数组, 映射了不同的访问路径与业务处理模块对应函数的一一对应关系

function start(route, handle) {

    function onRequest(request, response) {

        var pathname = url.parse(request.url).pathname;

        var html = route(handle, pathname);

        response.writeHead(200, { "Content-Type": "text/plain" });

        response.write(html);

        response.end();

    }

    http.createServer(onRequest).listen(8088);

}



exports.start = start; 

入口主模块 index.js:

与以往启动使用 server.js 不同,带路由功能,一般都会通过 index.js 启动


var server = require("./server");

var router = require("./router");

var requestHandlers = require("./requestHandlers");



var handle = {}

handle["/listCategory"] = requestHandlers.listCategory;

handle["/listProduct"] = requestHandlers.listProduct;



server.start(router.route, handle); 

思路整理:

  1. 通过如下方式启动服务器```

    node index.js

    
    
  2. index.js 调用了 server.start 函数,并且传递了 router.js 里 route 函数和 handle 数组作为参数

  3. serverl.js 通过了 8088 端口启动了服务,然后用 onRequest 函数来处理业务

    3.1 在 onRequest 中,首先获取访问路径 pathname

    3.2 然后调用 router.js 的 route 函数,并把 pathname 和 handle 数组传递进去

  4. 在 router.js 中,通过 pathname 为下标调用真正的业务函数,并把业务函数的返回值返回出去

    如果找不到,比如访问 /listUser 这个路径就没有在 handle 数组中找到对应,那么就会返回 listUser is not defined

  5. 当访问地址是 /listCategory 的时候, 真正的业务函数 requestHandlers.js 中的 listCategory() 就会被调用,并返回业务 Html 代码 : “a lots of categorys”

node.js 文件操作


该示例在之前路由的基础上进行衍生,见代码:文件操作

文件操作的核心:


var fs = require('fs');



function readFile() {

    var html = fs.readFileSync('how2j.html');

    return html;

}



function writeFile() {

    // 回调函数必须要,不然会报错

    fs.writeFile('how2java.html', 'hello from how2java', (err) => {

        if (err) throw err;

    });

    return "write successful";

} 

使用 npm 管理模块


npm 就是用来下载别人的模块,和发布自己的模块用的工具。

伴随着 node 的安装, npm 是自动安装的。

可以通过如下命令查看当前 npm 的版本:

npm -v

以下操作如果不加 -g 则不是代表全局操作,只代表对当前项目。

关于修改 npm 全局安装的路径,详见:https://www.cnblogs.com/zwjphp/p/14123746.html

使用 npm 全局安装 express 模块:


npm install express -g 

使用 npm 全局卸载 express 模块:


npm uninstall express -g 

查看全局安装的模块:


npm list -g 


除了可以安装别人发布的模块,我们也可以自己发布模块,所有 npm 都发布在 https://www.npmjs.com/,具体发布方法可以百度。

node.js 操作 mysql


安装 mysql 相关的模块:


npm install mysql -g 

数据库操作:


create database nodejs



use nodejs;

   

CREATE TABLE category_ (

  id int(11) NOT NULL AUTO_INCREMENT, # 主键自增

  name varchar(30) ,

  PRIMARY KEY (id)

) DEFAULT CHARSET=UTF8;



insert into category_ values(null,"category1");

insert into category_ values(null,"category2");

insert into category_ values(null,"category3");

insert into category_ values(null,"category4");

insert into category_ values(null,"category5"); 

db.js

  1. 编写函数 openConnection, 其中填写数据库链接的地址,账号,密码,数据库名称

  2. 编写函数 closeConnection, 用于关闭链接

  3. 编写数据库相关操作函数


var mysql = require("mysql"); // 引入mysql模块



var connection;



function openConnection() {

    connection = mysql.createConnection({

        host: "127.0.0.1",

        user: "root",

        password: "1234",

        database: "nodejs"

    });

    connection.connect();

}



function closeConnection() {

    connection.end();

}



function showAll() {

    openConnection(); // 开启连接

    var sql = "SELECT * FROM category_ order by id asc";

    connection.query(sql, (err, results) => {

        if (err) {

            console.log("[SELECT ERROR] - ", err.message);

            return;

        }

        if (results) {

            console.log(results);

            for (var i = 0; i < results.length; i++) {

                console.log("%d\t%s", results[i].id, results[i].name);

            }

        }

    });

    closeConnection(); // 关闭连接

}



function add(name) {

    openConnection();

    var params = [null, name];

    var sql = "insert into category_ values (?,?)";

    connection.query(sql, params, (err, result) => {

        if (err) {

            console.log("[INSERT ERROR] - ", err.message);

            return;

        }

        console.log("insert success, the generated id is:", result.insertId);

    });

    closeConnection();

}



function remove(id) {

    openConnection();

    var params = [id];

    var sql = "delete from category_ where id = ?";

    connection.query(sql, params, (err, result) => {

        if (err) {

            console.log("[REMOVE ERROR] - ", err.message);

            return;

        }


# 最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些**二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析**,以及**算法刷题LeetCode中文版的小伙伴们可以点赞后[点击这里即可免费获取!](https://gitee.com/vip204888/java-p7)**

最后再分享一份**终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化**

![image](https://img-blog.csdnimg.cn/img_convert/73c691eeb8b632cb7bc9b3bd81813b30.png)

T ERROR] - ", err.message);

            return;

        }

        console.log("insert success, the generated id is:", result.insertId);

    });

    closeConnection();

}



function remove(id) {

    openConnection();

    var params = [id];

    var sql = "delete from category_ where id = ?";

    connection.query(sql, params, (err, result) => {

        if (err) {

            console.log("[REMOVE ERROR] - ", err.message);

            return;

        }


# 最后总结

搞定算法,面试字节再不怕,有需要文章中分享的这些**二叉树、链表、字符串、栈和队列等等各大面试高频知识点及解析**,以及**算法刷题LeetCode中文版的小伙伴们可以点赞后[点击这里即可免费获取!](https://gitee.com/vip204888/java-p7)**

最后再分享一份**终极手撕架构的大礼包(学习笔记):分布式+微服务+开源框架+性能优化**

[外链图片转存中...(img-dX2au7gq-1628586979561)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值