node.js(接口案例)

一个项目初试化,首先要创立一个单独的项目文件夹,然后终端npm init直接安装package.json,api.js接口文件,路由模块创立一个文件夹夹,路由函数又要分为一个模块,再把数据库创立好,基本就可以开始完成功能需求了,用后端node完成增删改查

项目文件分类:

img

1.接口文件

Go

// 1.初始化
// 1.1创建项目
const express = require('express')
const app = express()
// 1.2配置跨域
const cors = require('cors')
app.use(cors())
// 1.3配置解析表单中间件
// 错误点:记住要有参数
app.use(express.urlencoded({extended : false}))

// 2.3因为后面处理函数用到了很多res.send所以封装为一个全局中间件,给res绑定一个函数,那后面的中间件路由都可以用到这个函数了
app.use((req, res, next) => {
    res.cc = function(err, status = 1) {
        res.send({
            status,
            msg : err instanceof Error ? err.message : err
        })
    }
    next()
})

// 2.4.6配置解析token的中间件
const expressJWT = require('express-jwt')
const secretKey = require('./secretKey')
app.use(expressJWT({secret : secretKey.secretKey, algorithms : ['HS256']}).unless({path : [/^\/api\//]}))

// 1.4.4导入路由模块
const routerUser = require('./router/user')
const Joi = require('joi')
const { expressjwt } = require('express-jwt')
const { path } = require('express/lib/application')
app.use('/api', routerUser)
// 3.1.1个人中心路由导入
const infoRouter = require('./router/userinfo')
app.use('/my', infoRouter)

// 4.1.2文章管理导入
const article = require('./router/acticle')
app.use('/my/article', article)

// 5.1.2发布文章路由导入
const cates = require('./router/cate')
app.use('/my/article', cates)

// 2.2.3定义规则joi的错误级别中间件
app.use((err, req, res, next) => {
    if (err instanceof Joi.ValidationError) return res.send(err.message)
    // 2.4.7增加jwt错误中间件
    if (err.name == 'UnauthorizedError') return res.cc('身份认证失败')
    return res.send('其他错误')
})


app.listen(80, () => {
    console.log('http://127.0.0.1');
}) 

2.写好接口文件该去给路由创建模块

写好接口文件该去给路由创建模块

Go

// 1.4初始化路由相关文件夹 不光要给路由分装一个模块 里面的处理函数也要有一个模块
const express = require('express')
const { append } = require('express/lib/response')
const router = express.Router()
// 1.4.2导入路由处理函数
const routerHandler = require('../router_handler/user')

// 注册
// 2.2.2导入joi验证输入进来的是否合法
const expressJOI = require('@escook/express-joi')
const {schema_user_info} = require('../schema/user')
router.post('/reguser',expressJOI(schema_user_info), routerHandler.getReguser)

// 2.4登录
// 2.4.1添加语法规则,可以直接用注册的
router.post('/login',expressJOI(schema_user_info), routerHandler.getLogin)

module.exports = router 

3.处理函数模块

处理函数模块

Go

// 1.4.1初始化路由处理函数模块

//注册
const db = require('../mysql')
//导入密码加密解密包
const bcrypt = require('bcryptjs')
function getReguser(req, res) {
    // res.send('这里是注册模块')
    // 2.2.4检测用户名是否被占用 导入mysql
    let selectUser = 'select * from users where username = ?'
    db.query(selectUser, req.body.username, (err, results) => {
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于不确定具体的数据结构和功能要求,以下只提供一个简单的示例代码供参考。 HTML: ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>留言板</title> <link rel="stylesheet" href="/css/style.css"> </head> <body> <header> <h1>留言板</h1> <nav> <ul> <li><a href="/">首页</a></li> <li><a href="/login">登录</a></li> <li><a href="/register">注册</a></li> <li><a href="/logout">退出</a></li> </ul> </nav> </header> <main> <section> <h2>留言列表</h2> <ul id="message-list"></ul> </section> <section> <h2>发表留言</h2> <form id="message-form"> <input type="text" name="name" placeholder="姓名" required> <textarea name="content" placeholder="留言内容" required></textarea> <input type="submit" value="发表留言"> </form> </section> </main> <footer> <p>© 2021 xxxx公司</p> </footer> <script src="/js/jquery.js"></script> <script src="/js/main.js"></script> </body> </html> ``` CSS: ``` body { font-family: Arial, sans-serif; margin: 0; padding: 0; } header { background-color: #333; color: #fff; padding: 10px; } nav ul { list-style: none; margin: 0; padding: 0; } nav li { display: inline-block; margin-right: 10px; } nav a { color: inherit; text-decoration: none; } main { margin: 20px; } h2 { margin-top: 20px; } ul li { margin-bottom: 10px; } label { display: block; margin-bottom: 5px; } input[type="text"], textarea { display: block; width: 100%; padding: 5px; margin-bottom: 10px; box-sizing: border-box; border: 1px solid #ccc; border-radius: 3px; } input[type="submit"] { background-color: #333; color: #fff; border: none; padding: 10px 20px; border-radius: 3px; cursor: pointer; } footer { background-color: #ccc; color: #666; text-align: center; padding: 10px; } ``` JS: ``` // 首页加载时获取留言列表 $(document).ready(() => { $.ajax({ url: '/api/messages', method: 'GET', success: (data) => { if (data.success) { updateMessageList(data.messages); } else { alert(data.error); } }, error: () => { alert('获取留言列表失败'); } }); }); // 发表留言 $('#message-form').submit((event) => { event.preventDefault(); let formData = $(event.target).serialize(); $.ajax({ url: '/api/messages', method: 'POST', data: formData, success: (data) => { if (data.success) { alert('发表留言成功'); updateMessageList(data.messages); $('#message-form')[0].reset(); } else { alert(data.error); } }, error: () => { alert('发表留言失败'); } }); }); // 更新留言列表 function updateMessageList(messages) { let list = $('#message-list'); list.empty(); messages.forEach((message) => { let li = $('<li></li>'); let header = $('<header></header>'); let name = $('<span></span>').text(message.name); let time = $('<time></time>').text(new Date(message.time).toLocaleString()); let content = $('<p></p>').text(message.content); let deleteButton = $('<button></button>').text('删贴'); deleteButton.click(() => { if (window.confirm('确认删除该留言吗?')) { $.ajax({ url: '/api/messages/' + message.id, method: 'DELETE', success: (data) => { if (data.success) { alert('删除留言成功'); updateMessageList(data.messages); } else { alert(data.error); } }, error: () => { alert('删除留言失败'); } }); } }); header.append(name).append(' 发表于 ').append(time).append(deleteButton); li.append(header).append(content); list.append(li); }); } ``` Node.js 后端路由及数据处理逻辑: ``` const express = require('express'); const bodyParser = require('body-parser'); const session = require('express-session'); const app = express(); // 各种中间件的配置... // 首页展示留言列表 app.get('/', (req, res) => { res.sendFile(__dirname + '/public/index.html'); }); // 获取留言列表的API接口 app.get('/api/messages', (req, res) => { // 读取数据库中的留言信息 // ... res.json({ success: true, messages: messages }); }); // 发表留言的API接口 app.post('/api/messages', (req, res) => { if (!req.session.user) { res.json({ success: false, error: '请先登录' }); return; } let name = req.body.name; let content = req.body.content; let time = new Date().getTime(); // 将留言信息写入数据库 // ... res.json({ success: true, messages: messages }); }); // 删除留言的API接口 app.delete('/api/messages/:id', (req, res) => { let id = req.params.id; // 从数据库中删除指定id的留言 // ... res.json({ success: true, messages: messages }); }); // 登录页面 app.get('/login', (req, res) => { res.sendFile(__dirname + '/public/login.html'); }); // 登录处理 app.post('/login', (req, res) => { let email = req.body.email; let password = req.body.password; // 根据email和password验证登录信息 // ... req.session.user = { email: email }; res.json({ success: true }); }); // 注册页面 app.get('/register', (req, res) => { res.sendFile(__dirname + '/public/register.html'); }); // 注册处理 app.post('/register', (req, res) => { let email = req.body.email; let password = req.body.password; // 将email和password写入数据库 // ... req.session.user = { email: email }; res.json({ success: true }); }); // 修改密码页面 app.get('/change-password', (req, res) => { res.sendFile(__dirname + '/public/change-password.html'); }); // 修改密码处理 app.post('/change-password', (req, res) => { let oldPassword = req.body.oldPassword; let newPassword = req.body.newPassword; if (验证旧密码是否正确) { // 更新数据库中的密码 // ... res.json({ success: true }); } else { res.json({ success: false, error: '旧密码不正确' }); } }); // 忘记密码页面 app.get('/forgot-password', (req, res) => { res.sendFile(__dirname + '/public/forgot-password.html'); }); // 忘记密码处理 app.post('/forgot-password', (req, res) => { let email = req.body.email; // 根据email发送重置密码链接到用户邮箱 // ... res.json({ success: true }); }); app.listen(3000, () => { console.log('Server started on port 3000'); }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值