编写react时做了前后端分离的构建模式,那么就需要后端提供接口数据,决定使用nodejs编写简单的后端服务。本文主要是介绍了如何通过nodejs完成一个后端api的开发、调用、和线上部署的流程。希望能对大家有所作用。
本文转载自XUAO,版权归作者所有,本站仅做转载传播,点击可查看原文。
nodejs server 编写
创建一个工程目录,我就取名叫 blog-server
cmd到这个工程目录下安装相关依赖:
npm install express
npm install hotnode
npm install mysql
npm install cors
npm install body-parser
新建一个index.js引入需要使用的组件包,这个index.js就作为即将可以使用的服务入口。
const cors = require('cors');
const bodyParser = require('body-parser');
const express = require('express');
const mysql = require('mysql');
const app = express();
app.use(cors()); // 解决跨域
app.use(bodyParser.json()); // 解析参数,json请求
app.use(bodyParser.urlencoded({ extended: true }));// 表单请求
开启端口监听,当浏览器或者其他工具访问http://localhost:8888/时,会被本服务监听到
app.listen(8888, () => console.log('server running at http://localhost:8888/'));
监听get请求,并返回一段html标签,监听地址为基地址
app.get('/', (req, res) => {
res.send('<div style="color:red">error</div>')
})
get带参请求,并返回一段json数据,数据库查询的使用稍后再说
// 博客列表
app.get('/article-list', (req, res) => {
// page=1&pageSize=10&classifyId=2
var params = req.query
var pageSize = 15;
if (params.pageSize) { // 分页大小
pageSize = params.pageSize;
}
var page = 1;
if (params.page) { // 当前页数
page = params.page;
}
var classifyId = '';
if (params.classifyId) { // 分类id
classifyId = '&& type=' + params.classifyId;
}
const data = {
total: 0,
blog: []
}
conn.query('select count(1) as total from ‘表名’ WHERE state=1 ' + classifyId + ';', (e1, r1) => {
data.total = r1[0].total;
if (e1) {
// 此处返回一段json数据
res.json(new Result({ code: 1, msg: "fail", data: e1 }))
return
}
conn.query('SELECT * FROM ‘表名’ WHERE state=1 ' + classifyId + ' LIMIT ' + (page - 1) * pageSize + ',' + pageSize + ';', (e2, r) => {
if (e2) {
res.json(new Result({ code: 1, msg: "fail", data: e2 }))
return
}
r.forEach(element => {
element.content = element.content.substring(0, 100) + "..."
data.blog.push(element)
});
res.json(new Result({ data: data }))
})
})
})
post带参请求,
// 发起留言
app.post('/leave-message', (req, res, next) => {
console.log(req.body)
var params = req.body;
// 如果没有留言则不需要处理
if (!params.message) {
res.json(new Result({ code: 1, msg: "fail", data: params }))
return
}
const post = {
name: params.name,
message: params.message,
time: new Date().getTime()
}
conn.query('INSERT INTO ‘表名’ SET ?', post, (err, results) => {
if (err) {
console.log('err', err)
res.json(new Result({ code: 1, msg: "fail", data: err }))
return
}
res.json(new Result({ data: post }))
})
})
封装的一个统一返回的最外层数据格式
function Result({ code = 0, msg = "success", data = null }) {
this.code = code;
this.msg = msg;
this.data = data;
}
数据库的建立与连接
后端数据离不开数据库,nodejs连接远程数据库特别简单,先设置基础配置项,详情见注释
const option = {
host: 'localhost', // 数据库所在地址,如果需要访问远程数据库,可以查询远程数据库配置,此处只要填写地址
user: 'root', // 数据库用户名
password: '123456', // 数据库访问密码,这里必填,如果数据库没有创建密码,到了这里就需要给root用户创建一个密码
port: '3306', // 数据库开放端口
database: 'blog', // 数据库名
connectTimeout: 5000, // 连接超时时间
multipleStatements: false // 不允许多sql语句执行,防止sql注入攻击,默认false
}
建立数据库连接,此时已经由第三方组件库帮我们把复杂的内容处理完了,用就可以了。
const conn = mysql.createConnection(option);
数据库查询语句
conn.query('SELECT * FROM ‘表名’;', (e1, r) => {
if (e1) {
res.json(new Result({ code: 1, msg: "fail", data: e1 }))
return
}
res.json(new Result({ data: r }))
})
数据库插入,更多用法查阅 mysql 的具体使用文档
const post = { // 需要插入数据的参数
name: params.name,
message: params.message,
time: new Date().getTime()
}
conn.query('INSERT INTO ‘表名’ SET ?', post, (err, results) => {
if (err) {
console.log('err', err)
res.json(new Result({ code: 1, msg: "fail", data: err }))
return
}
res.json(new Result({ data: post }))
})
重要配置
如果工程根目录下没有生成 package.json
文件就新建一个并添加配置 dependencies 为导包版本所以此文件应该是自动生成的,如果生成此文件就修改配置,如下:
{
"main":"index.js",
"scripts": {
"start": "hotnode index.js"
},
"dependencies": {
"body-parser": "^1.19.0",
"cookie-parser": "^1.4.5",
"cors": "^2.8.5",
"express": "^4.17.1",
"hotnode": "^0.0.8",
"multer": "^1.4.2",
"mysql": "^2.18.1"
}
}
运行
至此,一个简单的nodejs实现的后端服务基本完成,在控制台中输入启动命令:
npm start
最后在浏览器中访问 http://localhost:8888/ 即有数据返回,post请求方式可以使用postman测试。
备注
hotnode
这个扩展库存在的目的是热更新,即每次修改代码后不需要重新启动