# node 基础知识
# nodejs 处理 get 请求
const http = require('http')
// 解析 get 请求的参数
const querystring = require('querystring')
const server = http.createServer((req, res) => {
console.log(req.method) // GET
const url = req.url // 获取请求的完整 url
// 解析 querystring
req.query = querystring.parse(url.split('?')[1])
res.end(JSON.stringify(req.query)) // 将 querystring 返回
})
server.listen(8000)
# nodejs 处理 post 请求
const http = require('http')
const server = http.createServer((req, res) => {
if (req.method === 'POST') {
// 数据格式
console.log('content-type', req.headers['content-type')
// 接收数据
let postData = ''
req.on('data', chunk => {
postdata += chunk.toString()
})
// 接收数据结束
req.on('end', () => {
console.log(postData)
// 在这里返回,因为是异步
res.end('hello world')
})
}
})
server.listen(8000)
# 设置返回的格式
const http = require('http')
const querystru=ing = require('querystring')
const server = http.createServer((req, res) => {
const method = req.method
const url = req.url
const path = url.split('?')[1]
// 设置返回格式为 JSON -- 设置返回的字符串的类型
res.setHeader('Content-type', 'application/json')
// 返回数据
const resData = {
method,
url,
path,
query
}
// 返回
if (method === 'GET') {
res.end(
JSON.stringify(resData)
)
}
if (method === 'POST') {
let postData = ''
req.on('data', chunk => {
postData += chunk
})
req.on('end', () => {
resData.postData = postData
res.end(
JSON.stringify(resData)
)
})
}
})
# 搭建开发环境
- 使用 nodemon 检测文件变化,自动重启 node 服务
- 使用 cross-env 设置环境变量,兼容 mac linux 和 windows
# 安装
首先进行安装: npm i cross-env -D npm i nodemon -D
# 配置环境
在 package.json 中添加下面的配置:
{
"scripts": {
"dev": "cross-env NODE_ENV=dev nodemon ./bin/www.js",
"prd": "cross-env NODE_ENV=production nodemon ./bin/www.js"
}
}
然后我们在代码中就可以通过 process.env.NODE_ENV 去检测我们的开发环境
// app.js
const serverHandle = (req, res) => {
// 设置返回格式 JSON
res.setHeader('Content-type', 'application/json');
const resData = {
env: process.env.NODE_ENV
};
// 这里可以进行处理一些请求中所需获取的参数比如 path、解析 query,处理 post data
res.end(JSON.stringify(resData));
};
module.exports = serverHandle;
创建 server 的代码:
// www.js
const http = require('http');
const PORT = 8000;
const serverHandle = require('../app');
const server = http.createServer(serverHandle);
server.listen(PORT);
# 初始化路由
文件路径
-src
--blog.js
--user.js
// user.js
const handleUserRouter = (req, res) => {
const method = req.method
const url = req.url
const path = req.path
// 登录
if (method === 'POST' && path === '/api/user/login') {
return {
msg: '登录接口'
}
}
}
module.exports = handleUserROuter
然后在 app.js 中:
const handleUserRouter = require('./src/user')
const blogHandleRouter = require('./src/blog')
const serverHandle = (res, res) => {
// 设置返回格式 JSON
res.setHeader('Content-type', 'application/json')
// 处理 user 路由
const userData = handleUserRouter(req, res)
if (userData) {
res.end(
JSON.stringify(userData)
)
return
}
const blogData = blogHandleRouter(req, res)
if (blogData) {
res.end (
JSON.stringify(blogData)
)
return
}
// 未命中路由 返回 404
// 设置状态码 text/plain 代表纯文本
res.writeHead(404, {'Content-type': 'text/plain'})
res.write("404 Not Found\n")
res.end()
}
module.exports = serverHandle
# 定义返回数据 Model
创建返回数据格式:
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 {
consructor(data, message) {
super(data, message)
this.errno = 0
}
}
class ErrorModel extends BaseModel {
consructor(data, message) {
super(data, message)
this.errno = -1
}
}
module.exports = {
SuccessModel,
ErrorModel
}
# 读取文件
在 fs 模块中,所有的方法都分为同步和异步两种实现,具有 sync 后缀的方法为同步方法,不具有 sync 后缀的方法为异步方法;
const fs = require('fs')
const path = require('path')
const fullFileName = path.resolve(__dirname, 'file', 'a.json')
// 异步回调的方式
fs.readFile(fullFileName, (err, data) => {
if (err) {
console.error(err)
return
}
// 默认读取出来格式为二进制,将他转换为字符串
console.log(data.toString())
})
// Promise
function getFileContent(fileName) {
return new Promise((resolve, reject) => {
const fullNsmr = path.resolve(__dirname, 'files', fileName)
fs.readFile(fullFileName, (err, data) => {
if (err) {
reject(err)
return
}
resolve(
JSON.parse(data.toString())
)
})
})
}
# 处理 post 请求的数据
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)
)
})
})
}
# 处理请求参数
可以在请求之前处理一些 controller 中需要的参数,比如 path,解析 querystring,以及处理 post data
// app.js
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
// 上面处理 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
}
})
};
module.exports = serverHandle;
阅读量:
评 论:
mysql连接 →