* [node.js 文件操作](about:blank#nodejs__178)
* [使用 npm 管理模块](about:blank#_npm__199)
* [node.js 操作 mysql](about:blank#nodejs__mysql_231)
node.js 框架 express
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);
思路整理:
通过如下方式启动服务器```
node index.js
index.js 调用了 server.start 函数,并且传递了 router.js 里 route 函数和 handle 数组作为参数
serverl.js 通过了 8088 端口启动了服务,然后用 onRequest 函数来处理业务
3.1 在 onRequest 中,首先获取访问路径 pathname
3.2 然后调用 router.js 的 route 函数,并把 pathname 和 handle 数组传递进去
在 router.js 中,通过 pathname 为下标调用真正的业务函数,并把业务函数的返回值返回出去
如果找不到,比如访问 /listUser 这个路径就没有在 handle 数组中找到对应,那么就会返回 listUser is not defined
当访问地址是 /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
编写函数 openConnection, 其中填写数据库链接的地址,账号,密码,数据库名称
编写函数 closeConnection, 用于关闭链接
编写数据库相关操作函数
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) => {
### 最后
这份《“java高分面试指南”-25分类227页1000+题50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香)
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**
![image](https://img-blog.csdnimg.cn/img_convert/4b49f0f0cf3b02f929e601a4eda2486f.png)
![image](https://img-blog.csdnimg.cn/img_convert/2fd1ddff191f42b7558689f081e76f1a.png)
ult) => {
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) => {
### 最后
这份《“java高分面试指南”-25分类227页1000+题50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香)
**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**
[外链图片转存中...(img-fe3AhIBS-1630389350925)]
[外链图片转存中...(img-UCmkOYUq-1630389350927)]