node.js网络请求与响应
使用原生Http包
//引入模块
var http = require('http');
// 返回一个server示例
var server = http.createServer();
//设置请求处理函数
server.on('request',function(request,response){
if(request.url == '/login'){
// response可以使用write来给客户端发送相应数据
response.write('hello node.js')
}else if(request.url == '/'){
response.write('please login first')
}else{
var product = [
{
name:'苹果',
price:100
},
{
name:'小米',
price:200
},
{
name:'三星',
price:300
}
];
response.end(JSON.stringify(product));
}
// 最后一定是用end来结束相应
response.end();
})
//绑定端口号 启动服务器 类似于日志
server.listen(3000,function(){
console.log('服务器启动成功了');
});
安装express
- 选择一个文件夹目录 新建express项目存放目录 mkdir express-demo
- cd express-demo 并初始化package.json文件 npm init -y
- 初始化express依赖 npm i express --save
- 在express-demo目录下就可以创建app.js等来编写代码
express简单使用
const express = require('express');
const app = express();
app.get('/',function(req,res){
res.send('hello world')
})
app.get('/login',function(req,res){
res.send('hello 欢迎登陆')
})
app.get('/getUserList',function(req,res){
var userList = [
{name:'黄杰1',age:10},
{name:'黄杰2',age:20},
{name:'黄杰3',age:30},
{name:'黄杰4',age:40},
]
res.send(userList)
})
// 加载外部文件资源 配置模板引擎 一定在使用router之前
//使用模板引擎要提前下载安装 npm i --save art-template
app.engine('html',require('express-art-template'))
// 公开指定目录
//这样做了 就可以直接通过/public/xx的方式来访问public目录中的所有资源了
//然后通过/public/js/main.js来访问资源
app.use('/public',express.static('./public/'))
app.use('/node_modules',express.static('./node_modules/'))
app.listen(3000,function(){
console.log('running...');
})
每次修改代码要重启服务器的解决办法nodemon
- npm i nodemon -g
- nodemon -v检查是否安装成功
- 使用nodemon + 文件名来运行该程序 以后修改代码 会自动重启服务器
获取参数
get协议
请求url : http://localhost:3000/login?username=admin&pass=123456
app.get('/login',function(req,res){
// 在express中直接使用req.query获取查询的字符串请求参数
console.log(req.query);
res.send('hello 欢迎登陆')
})
输出结果:{ username: ‘admin’, pass: ‘123456’ }
post协议
请求表单
<form action="/postLogin" method="POST">
用户名:<input type="text" name="username">
密 码:<input type="password" name="password"/>
<input type="submit" value="登录"/>
</form>
- npm i body-parser --save 来安装接受post协议请求参数的依赖
- 在app.js中配置如下代码
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());
配置post路由
// post协议的请求参数req.body
app.post('/postLogin',function(req,res){
console.log(req.body);
})
输出结果:{ username: ‘huangjie’, password: ‘123456’ }
express中提取路由模块
在app.js层级新建router.js文件
根据不同的路由调用不同的回调函数
const express = require('express');
// 使用express配置的路由
const router = express.Router();
const fs = require('fs');
router.get('/getUser',function(req,res){
fs.readFile('./public/db_user.txt','utf-8',function(error,data){
if(error) return console.log('读取数据失败');
var user = JSON.parse(data).user;
res.render('index.html',{
user
})
})
})
router.get('',function(){});
router.get('',function(){});
router.get('',function(){});
router.get('',function(){});
...
module.exports = router;
在app.js文件中
注意点:
- 所有的配置一律全部写在app.use(router)前
- post协议的参数读取前文有说明 不然获取不到
const bodyParser = require('body-parser');
const express = require('express');
const router = require('./router');
const app = express();
// 加载外部文件资源 配置模板引擎 一定在使用router之前
app.engine('html',require('express-art-template'))
// 暴露静态资源 一定在使用router之前
app.use(express.static('./views/'))
// 配置读取post协议请求参数 一定在使用router之前
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());
// 使用路由
app.use(router);
app.listen(3000,function(){
console.log('running');
})
node.js操作mysql
全程统一一个方法 .query(),编写不同的sql语句即可
- 安装mysql npm i mysql --save
- 四步走
// node.js操作数据库
var mysql = require('mysql');
var connection = mysql.createConnection({
host:'localhost',
user:'root',
password:'root',
database:'nodedb'
});
connection.connect();
connection.query('select * from student',function(error,results,fields){
if(error) throw error;
results.forEach(item => {
console.log(item);
});
});
connection.end();
- 打印结果
RowDataPacket { id: 1, name: '黄杰1', age: 20, gender: '男', hobby: '跳舞' }
RowDataPacket { id: 2, name: '黄杰2', age: 20, gender: '男', hobby: '跳舞' }
RowDataPacket { id: 3, name: '黄杰3', age: 20, gender: '男', hobby: '跳舞' }
附上sql语句
USE nodedb;
CREATE table student(
id int(10) not null PRIMARY KEY,
name VARCHAR(20) not null,
age int(10),
gender VARCHAR(29) DEFAULT '男',
hobby VARCHAR(30)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
insert into student VALUES
(1,'黄杰1',20,'男','跳舞'),
(2,'黄杰2',20,'男','跳舞'),
(3,'黄杰3',20,'男','跳舞')
SELECT * from student;
使用mongoose操作mongodb
先下载安装Mongodb,参考mongodb菜鸟教程即可
再安装mongoose npm i --save mongoose
操作mongodb数据库参考文档即可
// 使用Mongoose来操作mongodb
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
const Cat = mongoose.model('Cat', { name: String , age:Number});
// new Cat(
// { name: '小黄',age:12 }
// ).save()
Cat.findOne({
name:'小蓝'
})
.then(data => {
if(data){
console.log('用户已存在');
}else{
console.log('用户不存在');
return new Cat({
name:'小蓝',
age:40
}).save();
}
})
.then(data => {
if(data){
console.log(data); //上次.then的返回值
}
})
express中间件
类似于java和前端vue框架中的过滤器,主要是指封装所有Http请求细节处理的方法。
一次Http请求通常包含很多工作,如记录日志、ip过滤、查询字符串、请求体解析、Cookie处理、权限验证、参数验证、异常处理等,但对于Web应用而言,并不希望接触到这么多细节性的处理,因此引入中间件来简化和隔离这些基础设施与业务逻辑之间的细节,让开发者能够关注在业务的开发上,以达到提升开发效率的目的。
var express = require('express');
var app = express();
// 不关注请求路径的中间件,任何请求都进入 java中的过滤器
app.use(function(req,res,next){
console.log('请求进入1');
res.send('hello 中间件');
next();
})
app.use(function(req,res,next){
console.log('请求进入2');
next();
})
// 以/xxx开头的路径中间件
app.use('/a',function(req,res,next){
console.log(req.url);
})
app.use('/b',function(req,res,next){
console.log(req.url);
})
// 加载外部文件资源 配置模板引擎 一定在使用router之前
app.engine('html',require('express-art-template'))
// 暴露静态资源 一定在使用router之前
app.use(express.static('./views/'))
app.use(function(req,res){
res.render('error.html')
})
app.listen(3000,function(){
console.log('running...');
})
以上内容是基于express框架,还有koa框架,以后再完善