news 2026/4/28 12:40:57

Node.js留言板开发全流程解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Node.js留言板开发全流程解析

留言板1.0

完整留言板1.0资源

// 需求:根据用户输入的地址,返回对应的页面 // 1- 搭建服务器 // 2- 根据不同的请求,返回对应的页面 const http = require('http'); const fs = require('fs'); const path = require('path'); const mime = require('mime'); const server = http.createServer(); server.on('request', (req, res) => { console.log('req.url:', req.url); // 根据不同的req.url 返回不同的页面 if (req.url.startsWith('/index') || req.url == '/') { //首页: 读取首页内容,返回给浏览器解析 fs.readFile(path.join(__dirname, 'pages/index.html'), (err, data) => { if (err) { return console.log(err); } res.end(data); // 返回给浏览器解析 }) } else if (req.url.startsWith('/add')) { //添加页面 fs.readFile(path.join(__dirname, 'pages/add.html'), (err, data) => { if (err) { return console.log(err); } res.end(data); // 返回给浏览器解析 }) } else if (req.url.startsWith('/assets')) { //静态资源 // 服务器之间读取对应文件,返回即可 fs.readFile(path.join(__dirname, req.url), (err, data) => { if (err) { return console.log(err); } // 给每个资源设置明确的mime类型 res.setHeader('content-type', mime.getType(req.url)); res.end(data); }) } else { res.end('404'); } }) server.listen(9999, () => console.log('http://localhost:9999 服务器已启动'));

留言板2.0

完整留言板2.0资源

目标: 动态渲染 留言板案例 1- 搭建服务器 2- 首页留言动态渲染 数据 + 模板 1- 读取数据库data.json中的数据 2- 配合模板引擎 进行渲染 3- 把生成好页面结构返回给浏览器解析 3- 删除留言 1- 获取前端传递id 2- 根据id去数据库中删除对应的 数据 数据以字符串形式存储,要以数组的形式去操作 1- 读取data.json数据,转出js的数组 2- 从数组中删除 3- 删除完成后,在把数组 写回 data.json 中 3- 删除完成后,跳转到首页 4- 添加留言 1- 获取 前端提交表单数据 2- 把数据添加到数据库中 数据以字符串形式存储,要以数组的形式去操作 1- 读取data.json数据,转出js的数组 2- 向数组中添加 3- 添加完成后,在把数组 写回 data.json 中 3- 添加完成后,跳转到首页 get post
// 1-搭建服务器 const http = require('http'); const fs = require('fs'); const path = require('path'); const template = require('art-template'); const mime = require('mime'); const url = require('url'); const moment = require('moment'); const queryString = require('querystring'); const server = http.createServer(); const dataPath = path.join(__dirname, 'data/data.json'); server.on('request', (req, res) => { console.log('req.url:', req.url); // 路由功能 if (req.url.startsWith('/index') || req.url == '/') { //首页 // 1- 读取数据库data.json中的数据 // 2- 配合模板引擎 进行渲染 // 3- 把生成好页面结构返回给浏览器解析 fs.readFile(dataPath, 'utf8', (err, data) => { if (err) { return console.log(err); } // 获取到了数据 data = JSON.parse(data); //json-->js对象 console.log(data); // 渲染 let str = template(path.join(__dirname, 'pages/index.html'), data); // 返回给浏览器解析 res.end(str); }) } else if (req.url.startsWith('/add')) { // add.html // 直接读取 add页面返回即可 fs.readFile(path.join(__dirname, 'pages/add.html'), (err, data) => { if (err) { return console.log(err); } res.end(data); //返回读取的页面 }) } else if (req.url.startsWith('/assets')) { //静态资源 // 直接读取静态资源返回即可 fs.readFile(path.join(__dirname, req.url), (err, data) => { if (err) { return console.log(err); } // 给返回资源设置明确的mime类型 res.setHeader('content-type', mime.getType(req.url)); // 返回读取数据 res.end(data); }) } else if (req.url.startsWith('/delete')) { // 删除 // 1- 获取前端传递id // 2- 根据id去数据库中删除对应的 数据 // 数据以字符串形式存储,要以数组的形式去操作 // 1- 读取data.json数据,转出js的数组 // 2- 从数组中删除 // 3- 删除完成后,在把数组 写回 data.json 中 // 3- 删除完成后,页面重新渲染 // 1- 获取前端传递id let id = url.parse(req.url, true).query.id; // 2- 读取data.json数据,转出js的数组 fs.readFile(dataPath, 'utf8', (err, data) => { if (err) { return console.log(err); } data = JSON.parse(data); // 转出js的数组 // // console.log(data); // // 数组删除 splice(从哪删, 删几个) 拿到是id, 数据要根据下标去删除 // // 获取当前id对应下标 // // let index = data.list.findIndex(function (v) { // // return v.id == id; // // }) // 根据id 找下标 let index = data.list.findIndex(v => v.id == id); // console.log(index); data.list.splice(index, 1); data = JSON.stringify(data); // 写回data.json中 fs.writeFile(dataPath, data, (err) => { if (err) { return console.log(err); } // 跳转到首页 // 跳转是浏览器的行为, 服务器无法直接控制浏览器跳转, 但是服务器可以通知浏览器跳转, // 浏览器会按照服务器通知,跳转到对应的页面; res.statusCode = 302; //设置状态码 通知浏览器进行跳转 res.setHeader('location', '/index'); // 设置跳转的地址 res.end(); }) }) // res.end(id); } else if (req.url.startsWith('/submit') && req.method == "GET") { // get 添加 // 1- 获取 前端提交表单数据 // 2- 把数据添加到数据库中 // 数据以字符串形式存储,要以数组的形式去操作 // 1- 读取data.json数据,转出js的数组 // 2- 向数组中添加 // 3- 添加完成后,在把数组 写回 data.json 中 // 3- 添加完成后,跳转到首页 let info = url.parse(req.url, true).query; // 添加id 和 创建时间 info.id = Date.now(); // 获取当前的时间戳 info.created = moment().format('YYYY年MM月DD日 HH:mm:ss'); console.log(info); // 读取data.json数据,转出js的数组 fs.readFile(dataPath, 'utf8', (err, data) => { if (err) { return console.log(err); } data = JSON.parse(data); //json-->js对象 data.list.push(info); //添加 data = JSON.stringify(data); // js --->js fs.writeFile(dataPath, data, (err) => { if (err) { return console.log(err); } //跳转到首页 重定向 res.statusCode = 302; res.setHeader('location', '/index'); res.end(); }) }); } else if (req.url.startsWith('/submit') && req.method == "POST") { // post 添加 // 1- 获取 前端提交表单数据 // 2- 把数据添加到数据库中 // 数据以字符串形式存储,要以数组的形式去操作 // 1- 读取data.json数据,转出js的数组 // 2- 向数组中添加 // 3- 添加完成后,在把数组 写回 data.json 中 // 3- 添加完成后,跳转到首页 // 前端以post方式给后台传递了数据 会触发事件 let str = ''; let num = 0; req.on('data', function (chunk) { // chunk 块 片段 str += chunk; console.log(++num); }); // 当后台数据接收完成时, 触发end事件 req.on('end', function () { console.log(str); // nickname=11&title=11&content=11 查询字符串 let info = queryString.parse(str); // 添加id 和创建时间 info.id = Date.now(); info.created = moment().format('YYYY年MM月DD日 HH:mm:ss'); console.log(info); // 读取data.json数据,转出js的数组 fs.readFile(dataPath, 'utf8', (err, data) => { if (err) { return console.log(err); } data = JSON.parse(data); //json --> js对象 data.list.push(info); //添加 data = JSON.stringify(data); // js--> js fs.writeFile(dataPath, data, (err) => { if (err) { return console.log(err); } // 跳转到首页 res.statusCode = 302; res.setHeader('location', '/index'); res.end(); }) }) }) } else { // 404 res.end('404'); } }); server.listen(9999, () => { console.log('http://localhost:9999 服务器已启动') })

留言板2.1

完整留言板2.1资源

目标: 动态渲染 留言板案例 1- 搭建服务器 2- 首页留言动态渲染 数据 + 模板 1- 读取数据库data.json中的数据 2- 配合模板引擎 进行渲染 3- 把生成好页面结构返回给浏览器解析 3- 删除留言 1- 获取前端传递id 2- 根据id去数据库中删除对应的 数据 数据以字符串形式存储,要以数组的形式去操作 1- 读取data.json数据,转出js的数组 2- 从数组中删除 3- 删除完成后,在把数组 写回 data.json 中 3- 删除完成后,跳转到首页 4- 添加留言 1- 获取 前端提交表单数据 2- 把数据添加到数据库中 数据以字符串形式存储,要以数组的形式去操作 1- 读取data.json数据,转出js的数组 2- 向数组中添加 3- 添加完成后,在把数组 写回 data.json 中 3- 添加完成后,跳转到首页 get post
// 1-搭建服务器 const http = require('http'); const fs = require('fs'); const path = require('path'); const template = require('art-template'); const mime = require('mime'); const url = require('url'); const moment = require('moment'); const queryString = require('querystring'); const server = http.createServer(); const dataPath = path.join(__dirname, 'data/data.json'); server.on('request', (req, res) => { console.log('req.url:', req.url); // 路由功能 if (req.url.startsWith('/index') || req.url == '/') { //首页 // 1- 读取数据库data.json中的数据 // 2- 配合模板引擎 进行渲染 // 3- 把生成好页面结构返回给浏览器解析 readData(function (data) { //data就是读取到数据 //读取到数据后 执行逻辑 // 对数据进行排序 // data.list.sort(function (a, b) { // return b.id - a.id; // }) data.list.sort((a, b) => b.id - a.id); // console.log(data); let str = template(path.join(__dirname, 'pages/index.html'), data); // 渲染 res.end(str); }) } else if (req.url.startsWith('/add')) { // add.html // 直接读取 add页面返回即可 fs.readFile(path.join(__dirname, 'pages/add.html'), (err, data) => { if (err) { return console.log(err); } res.end(data); //返回读取的页面 }) } else if (req.url.startsWith('/assets')) { //静态资源 // 直接读取静态资源返回即可 fs.readFile(path.join(__dirname, req.url), (err, data) => { if (err) { return console.log(err); } // 给返回资源设置明确的mime类型 res.setHeader('content-type', mime.getType(req.url)); // 返回读取数据 res.end(data); }) } else if (req.url.startsWith('/delete')) { // 删除 // 1- 获取前端传递id // 2- 根据id去数据库中删除对应的 数据 // 数据以字符串形式存储,要以数组的形式去操作 // 1- 读取data.json数据,转出js的数组 // 2- 从数组中删除 // 3- 删除完成后,在把数组 写回 data.json 中 // 3- 删除完成后,页面重新渲染 let id = url.parse(req.url, true).query.id; // 获取id readData(function (data) { // data是读取的数据 let index = data.list.findIndex(v => v.id == id); //找下标 data.list.splice(index, 1); //删除 writeData(data, () => { //写入 goIndex(res); //去首页 }); // writeData(data, () => goIndex(res)); }) } else if (req.url.startsWith('/submit') && req.method == "GET") { // get 添加 // 1- 获取 前端提交表单数据 // 2- 把数据添加到数据库中 // 数据以字符串形式存储,要以数组的形式去操作 // 1- 读取data.json数据,转出js的数组 // 2- 向数组中添加 // 3- 添加完成后,在把数组 写回 data.json 中 // 3- 添加完成后,跳转到首页 let info = url.parse(req.url, true).query; info.id = Date.now(); info.created = moment().format('YYYY年MM月DD日 HH:mm:ss'); // 添加 readData((data) => { data.list.push(info); //添加 writeData(data, () => goIndex(res)); }); } else if (req.url.startsWith('/submit') && req.method == "POST") { // post 添加 // 1- 获取 前端提交表单数据 // 2- 把数据添加到数据库中 // 数据以字符串形式存储,要以数组的形式去操作 // 1- 读取data.json数据,转出js的数组 // 2- 向数组中添加 // 3- 添加完成后,在把数组 写回 data.json 中 // 3- 添加完成后,跳转到首页 // 前端以post方式给后台传递了数据 会触发事件 let str = ''; req.on('data', (chunk) => { str += chunk; }) req.on('end', () => { let info = queryString.parse(str); info.id = Date.now(); info.created = moment().format('YYYY年MM月DD日 HH:mm:ss'); // 添加 readData((data) => { data.list.push(info); //添加 writeData(data, () => goIndex(res)); }) }); } else { // 404 res.end('404'); } }); server.listen(9999, () => { console.log('http://localhost:9999 服务器已启动') }) // 封装公共代码: // 如何封装: 提取公共代码 , 变化部分 作为参数 // 1- 读取data.json文件数据的方法 // 2- 写入data.json文件的方法 // 3- 重定向的方法 // 1- 读取data.json文件数据的方法 // fn: 读取数据完成后的处理逻辑 function readData (fn) { fs.readFile(path.join(__dirname, 'data/data.json'), 'utf8', (err, data) => { if (err) { return console.log(err); } //json-->js data = JSON.parse(data); // 后续处理数据 ,将读取的数据交给fn进行处理 fn && fn(data); // if (fn) { // fn(data); // } }) } // 2- 写入data.json文件的方法 // data: 要写入的数据 // fn: 写入完成后处理逻辑 function writeData (data, fn) { data = JSON.stringify(data); // js对象转成json fs.writeFile(path.join(__dirname, 'data/data.json'), data, (err) => { if (err) { return console.log(err); } //写入成功的后续操作 fn && fn(); }) } // 3- 重定向的方法 // res: 响应报文的对象 function goIndex (res) { res.statusCode = 302; res.setHeader('location', '/index'); res.end(); } // function click (fn) {} // $('div').click(function (){ });

留言板3.0

完整留言板3.0资源

目标: 动态渲染 留言板案例 1- 搭建服务器 2- 首页留言动态渲染 数据 + 模板 1- 读取数据库data.json中的数据 2- 配合模板引擎 进行渲染 3- 把生成好页面结构返回给浏览器解析 3- 删除留言 1- 获取前端传递id 2- 根据id去数据库中删除对应的 数据 数据以字符串形式存储,要以数组的形式去操作 1- 读取data.json数据,转出js的数组 2- 从数组中删除 3- 删除完成后,在把数组 写回 data.json 中 3- 删除完成后,跳转到首页 4- 添加留言 1- 获取 前端提交表单数据 2- 把数据添加到数据库中 数据以字符串形式存储,要以数组的形式去操作 1- 读取data.json数据,转出js的数组 2- 向数组中添加 3- 添加完成后,在把数组 写回 data.json 中 3- 添加完成后,跳转到首页 get post

// 处理具体功能模块 // 提供各种功能, 向外暴露 const fs = require('fs'); const path = require('path'); const template = require('art-template'); const mime = require('mime'); const url = require('url'); const moment = require('moment'); const queryString = require('querystring'); const tools = require('./tools'); module.exports = { showIndex (req, res) { //显示首页 // 1- 读取数据库data.json中的数据 // 2- 配合模板引擎 进行渲染 // 3- 把生成好页面结构返回给浏览器解析 tools.readData(function (data) { //data就是读取到数据 //读取到数据后 执行逻辑 // 对数据进行排序 // data.list.sort(function (a, b) { // return b.id - a.id; // }) data.list.sort((a, b) => b.id - a.id); // console.log(data); let str = template(path.join(__dirname, 'pages/index.html'), data); // 渲染 res.end(str); }) }, showAdd (req, res) {//显示add.html // 直接读取 add页面返回即可 fs.readFile(path.join(__dirname, 'pages/add.html'), (err, data) => { if (err) { return console.log(err); } res.end(data); //返回读取的页面 }) }, showAssets (req, res) { // 显示静态资源 // 直接读取静态资源返回即可 fs.readFile(path.join(__dirname, req.url), (err, data) => { if (err) { return console.log(err); } // 给返回资源设置明确的mime类型 res.setHeader('content-type', mime.getType(req.url)); // 返回读取数据 res.end(data); }) }, delete (req, res) { // 删除 // 1- 获取前端传递id // 2- 根据id去数据库中删除对应的 数据 // 数据以字符串形式存储,要以数组的形式去操作 // 1- 读取data.json数据,转出js的数组 // 2- 从数组中删除 // 3- 删除完成后,在把数组 写回 data.json 中 // 3- 删除完成后,页面重新渲染 let id = url.parse(req.url, true).query.id; // 获取id tools.readData(function (data) { // data是读取的数据 let index = data.list.findIndex(v => v.id == id); //找下标 data.list.splice(index, 1); //删除 tools.writeData(data, () => { //写入 tools.goIndex(res); //去首页 }); // tools.writeData(data, () => tools.goIndex(res)); }) }, getSubmit (req, res) { // get 添加 // 1- 获取 前端提交表单数据 // 2- 把数据添加到数据库中 // 数据以字符串形式存储,要以数组的形式去操作 // 1- 读取data.json数据,转出js的数组 // 2- 向数组中添加 // 3- 添加完成后,在把数组 写回 data.json 中 // 3- 添加完成后,跳转到首页 let info = url.parse(req.url, true).query; info.id = Date.now(); info.created = moment().format('YYYY年MM月DD日 HH:mm:ss'); // 添加 tools.readData((data) => { data.list.push(info); //添加 tools.writeData(data, () => tools.goIndex(res)); }); }, postSubmit (req, res) { //post方式添加 // 1- 获取 前端提交表单数据 // 2- 把数据添加到数据库中 // 数据以字符串形式存储,要以数组的形式去操作 // 1- 读取data.json数据,转出js的数组 // 2- 向数组中添加 // 3- 添加完成后,在把数组 写回 data.json 中 // 3- 添加完成后,跳转到首页 // 前端以post方式给后台传递了数据 会触发事件 let str = ''; req.on('data', (chunk) => { str += chunk; }) req.on('end', () => { let info = queryString.parse(str); info.id = Date.now(); info.created = moment().format('YYYY年MM月DD日 HH:mm:ss'); // 添加 tools.readData((data) => { data.list.push(info); //添加 tools.writeData(data, () => tools.goIndex(res)); }) }); }, show404 (req, res) { //显示404 res.end('404'); } }
// 引入 const http = require('http'); const router = require('./router'); // 创建服务器 const server = http.createServer(); // 监听请求 server.on('request', (req, res) => { // 找路由模块处理路由 router(req, res); }); // 启动服务器 server.listen(9999, () => { console.log('http://localhost:9999 服务器已启动') });
// 路由: 是一套匹配规则, 用分配任务 (不需要处理细节) // 以函数的形式进行暴露,函数可以接受参数 const handler = require('./hanlder'); module.exports = function (req, res) { console.log('req.url:', req.url); // 路由功能 if (req.url.startsWith('/index') || req.url == '/') { //首页 handler.showIndex(req, res); } else if (req.url.startsWith('/add')) { // add.html handler.showAdd(req, res); } else if (req.url.startsWith('/assets')) { //静态资源 handler.showAssets(req, res); } else if (req.url.startsWith('/delete')) { // 删除 handler.delete(req, res); } else if (req.url.startsWith('/submit') && req.method == "GET") { // get 添加 handler.getSubmit(req, res); } else if (req.url.startsWith('/submit') && req.method == "POST") { // post 添加 handler.postSubmit(req, res); } else { // 404 handler.show404(req, res); } }
const fs = require('fs'); const path = require('path'); // 封装公共代码: // 如何封装: 提取公共代码 , 变化部分 作为参数 // 1- 读取data.json文件数据的方法 // 2- 写入data.json文件的方法 // 3- 重定向的方法 module.exports = { // 1- 读取data.json文件数据的方法 // fn: 读取数据完成后的处理逻辑 readData (fn) { fs.readFile(path.join(__dirname, 'data/data.json'), 'utf8', (err, data) => { if (err) { return console.log(err); } //json-->js data = JSON.parse(data); // 后续处理数据 ,将读取的数据交给fn进行处理 fn && fn(data); // if (fn) { // fn(data); // } }) }, // 2- 写入data.json文件的方法 // data: 要写入的数据 // fn: 写入完成后处理逻辑 writeData (data, fn) { data = JSON.stringify(data); // js对象转成json fs.writeFile(path.join(__dirname, 'data/data.json'), data, (err) => { if (err) { return console.log(err); } //写入成功的后续操作 fn && fn(); }) }, // 3- 重定向的方法 // res: 响应报文的对象 goIndex (res) { res.statusCode = 302; res.setHeader('location', '/index'); res.end(); } }

留言板4.0

完整留言板4.0资源

1- 搭建服务器 2- 首页渲染 取数据 + 模板引擎 1-读取data.json中数据 ,配合模板引擎渲染 3- 删除留言 1-后台获取前端传递id, 2-根据di找到对应下标 3-根据下标删除 4-删除完成后,跳转到首页 4- 添加留言 1- 获取前端 post方式提交数据 2- 把数据添加到数据库中 3- 添加完成后,跳转到首页

// 搭建服务器 const express = require('express'); // 引入 const router = require('./router'); const bodyParser = require('body-parser'); const app = express(); //创建实例 // 配置模板引擎使用 app.engine('html', require('express-art-template')); // 设置模板的位置 app.set('views', 'pages'); // 处理静态资源 app.use('/assets', express.static('assets')); // 给req.body赋值 app.use(bodyParser.urlencoded({ extended: false })); //绑定路由 app.use(router); app.listen(9999, () => console.log('http://localhost:9999 服务器已启动'));
// 使用外置路由对象绑定路由 const express = require('express'); const fs = require('fs'); const path = require('path'); const moment = require('moment'); const router = express.Router(); //创建外置路由对象 // 绑定路由 router.get('/', (req, res) => { //首页 // 读取data.json中数据 ,配合模板引擎渲染 // readData(data => { //data是读取的数据 // res.render('index.html', data); // }) readData(data => res.render('index.html', data)); }) router.get('/index', (req, res) => { //首页 res.redirect('/'); //重定向到 / }); router.get('/add', (req, res) => { //add添加页面 // 直接读取返回 res.sendFile(path.join(__dirname, 'pages/add.html')); }) router.get('/delete', (req, res) => { //删除 // 1-后台获取前端传递id, // 2-根据id找到对应下标 // 3-根据下标删除 // 4-删除完成后,跳转到首页 let id = req.query.id; // url.parse(req.url, true).query; readData(data => { let index = data.list.findIndex(v => v.id == id); //找下标 data.list.splice(index, 1); //删除 writeData(data, () => res.redirect('/')); // 写入完成后,跳转首页 }); }) router.post('/submit', (req, res) => { //post 添加 // 1- 获取前端 post方式提交数据 // 2- 把数据添加到数据库中 // 3- 添加完成后,跳转到首页 let info = req.body; // 添加id 和创建时间 info.id = Date.now(); info.created = moment().format('YYYY年MM月DD日 HH:mm:ss'); readData(data => { data.list.push(info);//添加 writeData(data, () => res.redirect('/')); // 写入完成后,去首页 }) }); // 导出 module.exports = router; // 封装 读写data.json数据方法 function readData (fn) { fs.readFile(path.join(__dirname, 'data/data.json'), 'utf8', (err, data) => { if (err) { return console.log(err); } data = JSON.parse(data); // json ->js fn && fn(data); // 由fn 处理读取的数据 }) } function writeData (data, fn) { data = JSON.stringify(data); fs.writeFile(path.join(__dirname, 'data/data.json'), data, err => { if (err) { return console.log(err); } //执行后续操作 fn && fn(); }) }

留言板5.0

完整留言板5.0资源

目标: 基于express 和 mysql数据库 实现留言板5.0 一、 准备好数据库 1-创建 zlyb数据库 2-向数据库中输入 meassge.sql user.sql , 注意: 编码utf-8 二、 搭建服务器 三、 完成具体各个功能 首页渲染: 取数据 +模板 取数据库获取所有数据,通过模板引擎渲染到页面中 删除思路: 获取前端传递id,根据id去数据库删除对应的数据,删除完成后,重新跳转到首页 添加思路: 获取前端提交的数据, 给数据添加创建时间, 把数据添加到数据库中, 添加完成, 重新跳转到首页

// 封装一个 node 操作mysql数据的方法 // 如何封装: 提供公共代码, 变化部分作为参数 // 使用mysql模块 操作mysql数据库 // 1- 下载 npm i mysql // 2- 引入 // 3-使用 // 大致步骤: // 1- 通过服务器 连接上数据库 // 2- 对数据库进行操作 // 3- 断开和数据连接 // 具体实现步骤: // 1-准备好 账号信息 // 2-创建一个数据库连接 // 3-连接上数据库 // 4-进行操作 // 5-断开和数据库连接 const mysql = require('mysql'); // 1-准备好 账号信息 let info = { host: '127.0.0.1', user: 'root', password: 'root', database: 'zlyb' } /* sql: 要执行sql语句 param: sql语句中参数 用来替换?的 fn: 操作完成后 后续处理逻辑 */ function myQuery (sql, param, fn) { // 2-创建一个数据库连接 let con = mysql.createConnection(info); // 3- 连接上数据库 con.connect(); // 4-操作 con.query(sql, param, (err, data) => { if (err) { return console.log(err); } //后续处理 fn && fn(data); }); // 5-断开 con.end(); } // 暴露 module.exports = myQuery;
// 基于express 搭建服务器 const express = require('express'); const router = require('./rotuer'); const bodyParser = require('body-parser'); const app = express(); //创建服务器 // 配置模板引擎 app.engine('html', require('express-art-template')); // 模板目录 app.set('views', 'pages'); // 静态资源托管 app.use('/assets', express.static('assets')); // 给req.body赋值 app.use(bodyParser.urlencoded({ extended: false })); // 处理路由 app.use(router); app.listen(9999, () => console.log('http://localhost:9999 服务器已启动'));
// 外置路由对象 提供路由 const express = require('express'); const path = require('path'); const moment = require('moment'); const db = require('./db'); // 创建 外置路由对象 const router = express.Router(); // 绑定路由 router.get('/', (req, res) => { // 首页 // 取数据库获取所有数据,通过模板引擎渲染到页面中 db('select * from message', null, (data) => { // console.log(data); // data是数组 res.render('index.html', { list: data }); // 渲染 }) }); router.get('/index', (req, res) => { //首页 res.redirect('/'); }) router.get('/add', (req, res) => { //添加 res.sendFile(path.join(__dirname, 'pages/add.html')); }) router.get('/delete', (req, res) => { // 删除 // 获取前端传递id,根据id去数据库删除对应的数据,删除完成后,重新跳转到首页 let id = req.query.id; db('delete from message where id = ?', id, () => res.redirect('/')); }) router.post('/submit', (req, res) => { // post 提交 // 获取前端提交的数据, 给数据添加创建时间, 把数据添加到数据库中, 添加完成, 重新跳转到首页 let info = req.body; info.created = moment().format('YYYY-MM-DD HH:mm:ss'); db('insert into message set ?', info, () => res.redirect('/')); }) // 作业: 以上代码 都用一行写出来 // 导出 module.exports = router;
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 16:53:14

收藏!154万年薪引爆圈:大模型应用开发,程序员的AI时代黄金船票

2025年春,一则招聘信息在程序员圈子掀起滔天巨浪:某头部科技企业为“大模型应用开发工程师”岗位开出154万年薪,这并非博眼球的营销噱头,而是招聘市场上真实成交的案例。当“35岁职业瓶颈”“技术内卷疲惫”成为不少开发者的日常焦…

作者头像 李华
网站建设 2026/4/28 9:07:25

msnetobj.dll文件损坏丢失找不到 打不开软件问题 下载方法

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/4/24 3:09:14

震惊!2025年Agent元年揭秘:大模型编程开发已悄然改变程序员命运!小白必看AI编程Agent崛起,Cursor、GitHub Copilot如何重塑开发流程?

今天作为2025 Agent元年的最后一周,我们很有必要用更全面的视角,看一看 Agent 在25年到底发展的如何,各个公司实际执行情况是什么,所有这一切都将为我们在26年如何对待Agent提供方向。首先,我们来看看25年的AI大事件&a…

作者头像 李华
网站建设 2026/4/25 1:19:02

学长亲荐8个AI论文软件,专科生毕业论文格式规范神器!

学长亲荐8个AI论文软件,专科生毕业论文格式规范神器! 专科生论文写作的救星,AI工具如何帮你省时省力 对于很多专科生来说,毕业论文不仅是学术能力的考验,更是时间与精力的双重挑战。尤其是在选题、撰写、修改和查重等环…

作者头像 李华
网站建设 2026/4/18 22:09:07

荣联汇智智能立体仓库:重塑仓储效率的智慧引擎

在供应链效率决定企业竞争力的今天,传统仓储模式正面临着空间利用率低、人力成本高、管理精度差、响应速度慢等多重挑战。天津荣联汇智智能科技有限公司,依托其在工业互联网与标识解析领域的技术积淀,推出智能立体仓库整体解决方案&#xff0…

作者头像 李华