NodeJS编写后端接口

news2024/11/23 20:38:08

技术栈

1.express:Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建

各种 Web 应用,和丰富的 HTTP 工具,使用 Express 可以快速地搭建一个完整功能的网站。

2.mysql:用于操作MySQL数据库

3.body-parser:用于解析JSON请求体

源码

链接:node_admin: NodeJS编写后端接口

具体实现

1.新建文件夹命名为Project,并在文件夹内使用cmd命令初始化node项目

npm init

2.引入相关依赖

npm i express -S
npm i mysql -S
npm i body-parser -S

3.新建utils目录,新建DbUtil,用于连接MySQL的工具类

const mysql = require('mysql');

function createConnection() {
    const connection = mysql.createConnection({
        host: 'localhost',
        user: 'root',
        port: '3306',
        password: 'admin',     // 改成你自己的密码
        database: 'mumangguo'    // 改成你的数据库名称
    });

    connection.connect((err) => {
        if (err) {
            console.error('Error connecting to database: ' + err.stack);
            return;
        }
        console.log('Connected to database as ID ' + connection.threadId);
    });

    return connection;
}

module.exports = {
    createConnection
};

4.在utils目录中继续新建Server.js,用于创建服务器的工具类

const express = require('express');
const bodyParser = require('body-parser'); // 如果使用的是body-parser中间件

function startServer() {
    const app = express();

    // 监听端口
    const server = app.listen(8080, '127.0.0.1', function () {
        const host = server.address().address;
        const port = server.address().port;
        console.log("地址为 http://%s:%s", host, port);
    });

    // 设置跨域访问
    app.all('*', function(req, res, next) {
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "*");
        res.header("Access-Control-Allow-Methods", "*");
        next();
    });

    // 使用 body-parser 中间件来解析 JSON 请求体
    app.use(bodyParser.json());

    return app;
}

module.exports = startServer;

5.在项目根目录下新建user目录,在user目录中新建UserController.js文件,用于编写处理用户表的相关操作方法

const {createConnection} = require('../utils/DbUtil');
const connection = createConnection();

// 登录方法
exports.login = (req, res) => {
    const {username, password} = req.body;
    const sql = `SELECT * FROM user WHERE username = '${username}' AND password = '${password}'`;
    connection.query(sql, (err, result) => {
        if (err) {
            res.status(500).json({code: 500, msg: '登录失败'});
        } else {
            if (result.length > 0) {
                res.status(200).json({code: 200, msg: '登录成功'});
            } else {
                res.status(500).json({code: 500, msg: '用户名或密码错误'});
            }
        }
    });
};

//注册方法
exports.register = (req, res) => {
    const {username, password} = req.body;
    const sql = `INSERT INTO user (username, password) VALUES ('${username}', '${password}')`;
    connection.query(sql, (err, result) => {
        if (err) {
            res.status(500).json({code: 500, msg: '注册失败'});
        } else {
            res.status(200).json({code: 200, msg: '注册成功'});
        }
    });
};

6.在项目根目录下新建main.js入口文件

const startServer = require('./utils/Server');
const {login, register} = require("./user/UserController");

const app = startServer();

// 处理登录请求
// {"username":"admin","password":"admin"}
app.post('/login', (req, res) => {
    // 调用UserController的login方法
    login(req, res);
});

// 处理注册请求
// {"username":"admin","password":"admin"}
app.post('/register', (req, res) => {
    // 调用UserController的register方法
    register(req, res);
});

7.建立数据库相关表结构

/*
 Navicat Premium Data Transfer

 Source Server         : Local
 Source Server Type    : MySQL
 Source Server Version : 80027 (8.0.27)
 Source Host           : 127.0.0.1:3306
 Source Schema         : mumangguo

 Target Server Type    : MySQL
 Target Server Version : 80027 (8.0.27)
 File Encoding         : 65001

 Date: 12/05/2024 15:12:52
*/
create database mumangguo;
use mumangguo;

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'admin', 'admin');

SET FOREIGN_KEY_CHECKS = 1;

8.在项目根目录中运行main.js文件,启动服务器测试接口即可!

node .\main.js

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1670197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch常用内置loss函数与正则化技术(补充小细节)

文章目录 前言一、常用损失函数(后面用到了新的会一一补充)1.1 回归中的损失函数1.1.1 nn.MSELoss()示例1:向量-向量示例2:矩阵--矩阵(维度必须一致才行)1.2 分类中的损失函数1.2.1 二分类(1)nn.BCELoss --- 二分类交叉熵损失函数示例1:向量-向量示例2:矩阵--矩阵(维…

618买什么划算?618买啥好?618数码好物推荐,必买清单大放送!

随着一年一度的618购物狂欢节的临近,作为数码领域的资深爱好者,我感到有责任为大家推荐精心挑选的数码精品。无论你是追逐科技尖端的探索者,还是希望通过智能装备提升生活品质的时尚人士,这里的每一款产品都能与你的心灵产生共鸣。…

基于PHP开发的图片高清无损在线压缩源码系统 带完整源代码以及搭建教程

系统概述 高清无损在线压缩源码系统基于PHP语言开发,结合GD库和ImageMagick等图像处理工具,实现了对JPEG、PNG、GIF等多种图片格式的高清无损压缩。系统采用B/S架构,用户只需通过浏览器访问系统界面,即可实现图片的上传、压缩、预…

【小白入门篇6】常识|怎么计算模型需要的资源

01 背景 各个公司相继推出大模型, 有开源和不开源,有些技术爱好者也开始心痒难耐,萌生了私有本地模型,甚至有伙伴构建大模型并进行训练的想法, 大模型不仅比拼技术, 也是比拼爹(资源)的存在, 我个人在实战经历经常问自己,到底需要什么样配置才能跑起来这个模型, 完…

玩转cpp小项目星球3周年了!

公众号原创文章破600!玩转cpp小项目星球目前已运营3年,平时不怎么宣传,借此机会给大家分享一下这三年里面我沉淀了哪些内容。里面包含: 1.小项目:一些核心模块的拆解,例如:grpc、mutex、线程池等…

python数据分析——数据分类汇总与统计

数据分类汇总与统计 前言一、Groupby分类统计语法按列分组示例一示例二示例三 遍历各分组示例 使用字典和Series分组示例 使用函数分组示例 二、数据聚合groupby的聚合函数示例一示例二 逐列及多函数应用示例一示例二 返回不含行索引的聚合数据示例 三、一般性的“拆分-应用-合…

程序员日志之星际争霸

目录 传送门正文日志1、概要2、星际争霸编年史2.1、最早版本 Alpha2.2、早期版本 Early Beta2.3、测试版 Beta2.4、正式版 StarCraft2.5、母巢之战测试版 BroodWar Beta2.6、星际争霸-母巢之战 BroodWar2.7、地图编辑器(1.07及以上) StarEdit2.8、《星际…

掌握决策之道:层次分析法(AHP)的步骤、应用与局限性

目录 一、层次分析法简介 举一个小例子: 评价类问题可用打分解决,比如:小华高考结束后,在华科和武大两所学校之间做抉择。 评价类问题可用打分解决 二、层次分析法的步骤 (一)一道引出层次分析法的例…

造纸废水处理有哪些工艺设备

造纸废水处理是一个复杂的过程,因为造纸过程中产生的废水含有大量的有机物、悬浮物、色素、油脂、木质素、纤维素等污染物。为了有效处理这些废水,通常需要采用一系列的工艺设备。以下是一些常见的造纸废水处理工艺设备: 格栅:用于…

申贷时,银行级大数据自己能查到吗?

随着金融风控的不断健全,大数据作为辅助的风控工具正在被越来越多的银行和机构使用。在进行申贷时,银行通常会进行大数据查询,以便评估申请人的信用状况。那么,这些大数据自己能查到吗?接下来本文就为大家详细介绍一下&#xff0…

OKHTTP 3.12.0 以后版本 headers 中不可携带中文

今天遇到的报错: java.lang.llegalArgumentException: Unexpected char 0x957f at 0 in x-brand value: 电视堆栈 okhttp3.Headers.checkValue(Headers.java:272) okhttp3.Headers$Builder.add(Headers.java:312) okhttp3.Request$Builder.addHeader(Request.iava:…

超便捷备忘录共享方法 文字文件都可共享

在这个信息爆炸的时代,备忘录已成为我们生活中不可或缺的小助手。它记录着我们的工作计划、待办事项、灵感闪现,甚至是那些温馨的家庭琐事。然而,当我们在不同的设备间穿梭,如何在手机、电脑,甚至是不同品牌的手机之间…

selenium进行xhs图片爬虫:05xhs一个博主的全部文章链接获取

在今天的文章中,是需要进行保持登录状态的,如果没有登录状态。会导致xhs博主下的文章数量缺失。 我使用的仍然是selenium远程调试,也就是我之前说的selenium操作已经打开的浏览器。这块内容配置还是挺简单的,大家可以去试试。 今…

vuerouter声明式导航

声明式导航-跳转传参数 1.查询参数传参 语法:to /path?参数名值 2.对应页面组件接受传来的值 $router.query.参数名 2.动态路由传参 1.配置动态路由 2.配置导航连接 to/path/参数值 3.对应页面组件接收传递过来的值 #route.params.参数名 多个参数传递&…

GPT搜索引擎原型曝光!

OpenAI发布会前一天,员工集体发疯中……上演大型套娃行为艺术。 A:我为B的兴奋感到兴奋;B:我为C的兴奋感到兴奋……Z:我为这些升级感到兴奋 与此同时还有小动作不断,比如现在GPT-4的文字描述已不再是“最先…

树莓派|SPI通信

SPI的原理 SPI(Serial Peripheral Interface)是一种同步的串行通信协议,它允许在单片机和外设之间高速地传输数据。SPI协议主要有以下特点: 采用全双工通信模式,同时支持主从模式(Master/Slave&#xff09…

JavaEE开发重中之重 异常 捕获并抛出异常 自定义异常 2024详解

异常就是代表程序可能出现的问题 Error代表系统级别的错误 属于严重问题 Error是给sun公司用的,不是给程序员用的 Exception代表程序可能出现的问题 叫做异常 编译阶段不会出现异常提醒 运行时会出现的异常 编译阶段就会出现的异常 异常体系的最上层父类是E…

DLRover 如何拯救算力浪费?10 分钟自动定位故障机,1 秒内保存 Checkpoint!

欢迎大家在 GitHub 上 Star 我们: 分布式全链路因果学习系统 OpenASCE: https://github.com/Open-All-Scale-Causal-Engine/OpenASCE 大模型驱动的知识图谱 OpenSPG: https://github.com/OpenSPG/openspg 大规模图学习系统 OpenAGL: https://github.com/TuGraph-…

flink cdc,读取datetime类型

:flink cdc,读取datetime类型,全都变成了时间戳 Flink CDC读取MySQL的datetime类型时会转换为时间戳的问题,可以通过在Flink CDC任务中添加相应的转换器来解决。具体来说,可以在MySQL数据源的debezium.source.converter配置项中指…

欢乐钓鱼大师攻略大全,稀有鱼介绍!

在《欢乐钓鱼大师》的广袤海域中,隐藏着无数神秘的鱼类,等待玩家们的探索。这不仅仅是一场钓鱼的冒险,更是一次心灵的洗礼。每一次挥杆都可能揭开一个新的秘密,让我们一起踏上这场奇妙的钓鱼之旅。 寻觅海域明珠:星光闪…