1创建项目
创建文件夹 blog-b
2初始化项目
cd 到项目目录
npm init -y
3 下载 nodemon ,使每次修改项目后 自动重启项目
npm i nodemon cross-env --save-dev
在 blog-b\package.json 文件中 配置 启动设置
"dev": "cross-env NODE_ENV=dev nodemon ./bin/www.js",
"prd": "cross-env NODE_ENV=production nodemon ./bin/www.js"
可以通过
npm run dev
或
npm run prd
启动项目
之所以 配置两个 ,是因为 线上 和 线下 配置的 ip 端口号 数据库 配置不同.
4 划分项目
新建 app.js和bin 文件和 src 文件
app.js 放所有代码统一请求的处理
src 放 业务代码
bin 放 程序的启动文件
5 编写项目的启动文件
在 bin中创建 www.js 文件
/**
* 此文件只写 服务的基本代码
*/
//引入 http 模块
const http = require('http');
//引入app模块
const serverHandle = require("../app");
//设置端口号
const PORT= 8004;
//创建服务
const server= http.createServer(serverHandle);
//设置端口号
server.listen(PORT)
6 编写 app.js
const queryString = require('querystring');
const handlerBlogRouter = require('./src/router/blog');
const handlerUserRouter = require('./src/router/user');
/**
* 对所有请求 相同部分进行统一的处理
*/
const serverHandle =(req,res)=>{
//设置返回时客户端接受格式
res.setHeader('Content-type', 'application/json');
const url = req.url;
//切割请求的url
req.path = url.split('?')[0];//获取请求的路由
req.query = queryString.parse(url.split('?')[1]);//将get请求发送过来的数据映射成对象
//对路由进行分离, 封装业务逻辑
//博客请求的路由
const blogResult = handlerBlogRouter(req, res);
if(blogResult){
res.end(JSON.stringify(blogResult));
return;
}
//用户路由
const userData = handlerUserRouter(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
7在 src 分为 路由层和业务成
在 src 创建router文件夹 ,路由分为 博客相关的路由和 用户相关的路由 ,所以创建 blog.js 和user.js;
blog.js
const { SuccessModel, ErrorModel } = require('../model/resModel');
const handleBlogRouter = (req, res) => {
const method = req.method;
const id = req.query.id;
//获取博客列表
if (method === 'GET' && req.path === '/api/blog/list') {
return SuccessModel(
{
"title": "标题",
"": "作者",
"content":"内容",
}
);
}
//获取指定博客
if (method === 'GET' && req.path === '/api/blog/detail') {
return SuccessModel("获取指定博客")
}
//新建博客
if (method === 'POST' && req.path === '/api/blog/new') {
return SuccessModel("新建博客")
}
//更新博客
if (method === 'POST' && req.path === '/api/blog/update') {
return SuccessModel("更新博客")
}
//删除博客
if (method === "POST" && req.path === '/api/blog/del') {
return SuccessModel("删除博客")
}
};
module.exports = handleBlogRouter;
user.js
const { SuccessModel, ErrorModel } = require('../model/resModel');
const handleUserRouter = (req, res) => {
if (method === "POST" && req.path === "/api/user/login") {
return new SuccessModel()
}
};
module.exports = handleUserRouter;
8 为了统一返回的格式 ,对返回 数据进行一层封装
在src 下创建 model 文件夹, 这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
};
现在可以测试各个路由是否畅通