学习Node.js- 【1】搭建开发环境
2020-08-18 本文已影响0人
zzyo96
一、nodejs一个简单实例

二、nodejs处理get请求
get请求,通过querystring来传递数据,如a.html?a=100&b=200 。 浏览器直接访问, 就发送get请求

三、处理post请求

——————————————————————————
搭建开发环境
- 使用nodemon检测文件变化,自动重启node
- 使用cross-env设置环境变量,兼容mac linux 和 windows
————————————————————
项目搭建主要流程从0到1(个人总结)
代码地址:https://github.com/zzyo96/node_blog
-
新建一个项目目录为node_blog
总的目录结构是这样的
image.png
-
在bin目录创建www.js 里面写好基本的server,将http.createServer的回调函数进行拆分至根目录下app.js,为了便于管理和维护

- app.js, 不关心业务代码,只进行一些请求和响应的基本处理,在这里通过getPostData函数结合promise语法,处理Post请求对数据的获取。具体路由逻辑拆分在./src/router/blog.js中
const querystring = require('querystring');
const handleBlogRouter = require('./src/router/blog.js')
const handleUserRouter = require('./src/router/user.js')
//用于处理 post data
const getPostData = (req)=>{
return new Promise((resolve,reject)=>{
if(req.method !== 'POST'){
resolve({})
return
}
if(req.headers['content-type']!=='application/json'){
resolve({})
return
}
let postData = ''
req.on('data',chunk =>{
postData += chunk.toString();
})
req.on('end',()=>{
if(!postData){
resolve({})
return
}
resolve(
JSON.parse(postData)
)
})
})
};
const serverHandle = (req,res) =>{
// 设置返回格式JSON
res.setHeader('Content-type','application/json')
// 获取path
const url = req.url;
req.path = url.split('?')[0]
// 解析query
req.query = querystring.parse(url.split('?')[1])
// 处理post data
getPostData(req).then(postData=>{
req.body = postData;
// 处理blog路由
const blogData = handleBlogRouter(req,res)
if(blogData){
res.end(
JSON.stringify(blogData)
);
return
}
// 处理user路由
const userData = handleUserRouter(req,res);
if(userData){
res.end(
JSON.stringify(userData)
);
return
}
// 未命中路由,返回404
res.writeHead(404,{"Content-type":"text/plain"});
res.write("404 Not Found\n");
res.end();
})
};
module.exports = serverHandle
- ./src/router/blog.js 这里不关心具体业务逻辑代码, 只是处理返回的结果,返回的结果通过successmodel和errormodel进行了一次封装


- model/resmodel.js 对返回结果进行统一的封装
class BaseModel{
constructor(data,message){
if(typeof data === 'string'){
this.message = data
data = null
message =null
}
if(data){
this.data = data
}
if(message){
this.message = message
}
}
}
class SuccessModel extends BaseModel{
constructor(data,message){
super(data,message)
this.errno = 0
}
}
class ErrorModel extends BaseModel{
constructor (data,message){
super(data, message);
this.errno = -1
}
}
module.exports = {
SuccessModel,
ErrorModel
};
- ./src/controlller/blog.js 这里写具体业务代码返回的数据
