Express做后端服务详细步骤,从零到一

news2024/11/28 18:48:47

文章目录

  • 一、全局安装脚手架
  • 二、生成项目
    • 1.生成项目
    • 2.目录结构介绍
    • 3.拓展:配置文件热更新(避免改一次文件重启一次服务)
      • 步骤1:安装nodemon
      • 步骤2:创建nodemon.json文件
      • 步骤3:更改启动命令
      • 步骤4:上述步骤全部成功之后重启服务验证
  • 三、做具体需求
    • 1.需求描述
    • 2.前端发送请求(这里笔者是react代码用的window.fetch进行的简单请求)
    • 3.后端跨域配置(不配置的话前端本地服务与后端本地服务由于同源策略的问题是无法通信的)
    • 4.搭建数据库
    • 5.express连接mysql数据库
      • ①安装依赖:
      • ②准备工作代码编写
      • ③实际业务代码编写
    • 6.串联自测功能

一、全局安装脚手架

npm install -g express-generator

二、生成项目

1.生成项目

express myapp

PS: 此命令会在你所在的当前目录下生成一个名为myapp的express项目

然后进入该项目并安包:

cd myapp
npm i

然后启动项目:

npm start

然后在浏览器中打开 http://localhost:3000/ 网址就可以看到这个应用了。

2.目录结构介绍

通过脚手架创建的应用一般都有如下目录结构:
在这里插入图片描述
我们一个一个文件先暂时了解一下其作用:

文件名作用
bin/wwwexpress启动文件,里面设置了端口、服务启动监听
node_modules我们执行完npm i后的各种依赖包都在这里
public存放静态文件的地方,可以忽略
routes我们做后端写接口的地方
views展示在浏览器上的内容,可以忽略
app.js入口文件、所有接口的注册以及404、error情况的捕获等
package-lock.json锁定包版本的文件、确保其他同事安的包跟你版本一致
package.json各种配置以及依赖的依赖包名等

3.拓展:配置文件热更新(避免改一次文件重启一次服务)

步骤1:安装nodemon

全局安装nodemon

npm install -g nodemon

或者进到项目目录里安装到项目中

npm install nodemon --save

步骤2:创建nodemon.json文件

然后在项目根目录下创建nodemon.json文件
文件内容:

{
    "restartable": "rs",
    "ignore": [
        ".git",
        ".svn",
        "node_modules/**/node_modules"
    ],
    "verbose": true,
    "execMap": {
        "js": "node --harmony"
    },
    "watch": [],
    "env": {
        "NODE_ENV": "development"
    },
    "ext": "ejs js json"
}
配置名其意义
restartable设置重启模式
ignore设置热更新忽略的文件
verbose设置日志输出模式,true 详细模式
execMap设置运行服务的后缀名与对应的命令
watch监听哪些文件的变化,当变化的时候自动重启
ext监控指定的后缀文件名

步骤3:更改启动命令

然后我们更改package.json中的启动命令:

找到scripts下的start、把node换成nodemon

{
  "scripts": {
    "start": "nodemon ./bin/www"
  }
}

步骤4:上述步骤全部成功之后重启服务验证

关闭当前服务后我们从新npm start启动服务,启动服务成功后我们修改一个接口的返回内容保存后到界面上试一下是否接口返回值变了,如果变了说明热更新配置成功,如果没变请按照步骤一从新确认一下是否全部操作成功并且保存文件了。

三、做具体需求

1.需求描述

比如我们现在有一个用户发送消息给我们,然后我们存到数据库中的一个需求,我们现在来一起实践一下。

2.前端发送请求(这里笔者是react代码用的window.fetch进行的简单请求)

// 请求方法
export const saveUserInfo = (params) => {
    return fetch('http://localhost:3000/users/sendDemand', {
        method: 'POST',
        body: JSON.stringify(params),
        headers: {
            'Content-Type': 'application/json',
        }
    }).then(res => res.json()).catch(err => err);
}

PS: params可按照自己具体需求传,笔者这里的params是:

{
 "userName": "1",
 "email": "2",
 "phone": "3",
 "userDesc": "4"
}

3.后端跨域配置(不配置的话前端本地服务与后端本地服务由于同源策略的问题是无法通信的)

请看:配置指定IP地址允许跨域访问

4.搭建数据库

由于内容过多,请访问:
本地安装Mysql并配置
Navicat for MySQL的使用

5.express连接mysql数据库

①安装依赖:

// 必装项:连接mysql服务的
npm i mysql -S
// 选装项:如果你需要校验请求参数的话就安express-validator
npm i express-validator -S
// 选装项:如果你需要获取用户的详细IP信息的话就安express-ip
npm i express-ip -S

②准备工作代码编写

如果你安装了express-ip,请在app.js中增加:

const expressip = require('express-ip');

app.use(expressip().getIpInfoMiddleware);

在这里插入图片描述

在根目录创建db文件夹,然后创建connection.js文件
文件内容如下:

//引入mysql
const mysql = require("mysql");

// 连接数据库的信息
const db = {
    host: 'localhost', //数据库地址,上线了之后替换你的服务器IP地址即可
    port: '3306',//端口号
    user: 'root',//用户名
    password: '',//填写你的数据库root账户的密码
    database: 'official_website'//要访问的数据库名称
};

// 封装数据库连接方法
const connectionDB = (sql, params, cb) => {
    // 创建数据库连接
    const connection = mysql.createConnection(db);
    // 连接数据库
    connection.connect((err, conn) => {
        if (err) {
            console.log("数据库连接失败");
            return;
        }
        console.log("数据库连接成功");
        connection.query(sql, params, cb)
    })
}

module.exports = connectionDB;

③实际业务代码编写

const DB = require('../db/connection');
const { body, validationResult } = require('express-validator');
var express = require('express');
var router = express.Router();

/* 接收用户需求接口 */
router.post(
  '/sendDemand',
  body('userName').notEmpty().withMessage('用户名不能为空'),
  body('phone').notEmpty().withMessage('手机号不能为空'),
  body('demand').notEmpty().withMessage('需求描述不能为空'),
  function (req, res, next) {
    // 校验参数
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(400).json({ errMsg: errors.array()[0]?.msg });
    }
    // END-校验参数
    // 解构参数并执行SQL
    const { userName, phone, email, demand } = req.body;
    DB(
      'insert into user_demand(name, phone, email, demand, ip_info) values(?, ?, ?, ?, ?)',
      [userName, phone, email, demand, JSON.stringify(req.ipInfo)],
      function (err, result) {
        if (err) {
          console.log('[SELECT ERROR]:');
          res.status(500).json({ msg: err.message });
        } else {
          res.send({
            code: 200,
            msg: '发送成功~我们会尽快联系您!',
          });
        }
      }
    );
    // END-解构参数并执行SQL
  });

module.exports = router;

6.串联自测功能

当前端的参数后端服务都接收到了且存到数据库了就证明没问题了~
在这里插入图片描述
在这里插入图片描述

全部完成~~

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

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

相关文章

如何准确测试相位噪声

相位噪声是表征CW信号频谱纯度的非常重要的参数,衡量了信号频率的短期稳定度。通常所说的相噪为单边带(SSB) 相位噪声,相噪的好坏对于系统的性能至关重要! 对于终端通信而言,如果接收机LO的相噪较差,且在信道附近存在…

GO语言开篇-Go语言急速入门(基础知识点)| 青训营笔记

文章目录一.GO语言应用场景1.1 前言1.2 什么是GO语言1.3 仅仅10行完成高并发的服务器二.入门2.1 基础语法-HelloWorld2.2 基础语法-变量类型2.2.1 变量2.2.2 if else2.2.3 循环2.2.4 switch2.2.5 数组2.2.6 切片2.2.7 map2.2.8 range2.2.9 函数2.2.10 指针2.2.11 结构体2.2.12 …

Java基础之《netty(24)—netty入站与出站机制》

一、基本说明 1、netty的组件设计:netty的主要组件有Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe等。 2、ChannelHandler充当了处理入站和出站数据的应用程序逻辑的容器。 例如,实现ChannelInboundHandler接口(或Chan…

开关电源详解

目录 电源分类 线性稳压电源(LDO) 适用场景 特点 基本组成 开关电源 适用场景 发展方向 特点 分类 基本组成: 开关电源和线性电源对比: 两款开关电源的性能参数对比: 某款电源适配器: 电源分类…

Python NumPy 拆分数组

前言NumPy(Numerical Python的缩写)是一个开源的Python科学计算库。使用NumPy,就可以很自然地使用数组和矩阵。NumPy包含很多实用的数学函数,涵盖线性代数运算、傅里叶变换和随机数生成等功能。本文主要介绍Python NumPy 拆分数组…

2-求和(蓝桥杯)

问题描述给定 nn 个整数 a_1, a_2, , a_na1,a2,⋅⋅⋅,an ,求它们两两相乘再相加的和,即:Sa_{1} \cdot a_{2}a_{1} \cdot a_{3}\cdotsa_{1} \cdot a_{n}a_{2} \cdot a_{3}\cdotsa_{n-2} \cdot a_{n-1}a_{n-2} \cdot a_{n}a_{n-1} \cdot a_…

2022考研人年度总结,描摹23实习备战进行时

今年,是硝烟弥漫的一年在各个科目上努力也常常焦虑不断怀疑是否真的可以在考研的道路上每一件努力的小事看起来无所谓但却十分有必要2022考研热词是“努力” “披星戴月”“痛苦”你的每一个清晨与深夜都刻满了泪水与汗水春天你最爱期待夏天,夏天你说秋天…

JAVA开发运维(CI/CD)

CI :持续性集成CD:持续性部署SIT:系统集成测试UAT:用户验收测试研发流程的变化,因为用户永远一开始不知道自己想要什么样的东西,导致了软件无法从一而终的进行设计,用户需要能立刻运行的软件和功能。&#…

再学C语言36:指针和数组

指针提供了一种用来使用地址的符号方法,可以很有效地处理数组 数组标记实际上是一种变相使用指针的形式 数组名同时也是该数组首元素的地址,如果arr是一个数组,则: arr &arr[0]; 在C中,对一个指针加1的结果是…

【ROS】使用pluginlib自定义costmap地图层

文章目录 文章目录 前言 一、重写地图层 1.包含头文件 2.onInitialize() 3.updateBounds() 4.updateCosts() 二、向ROS注册 1.插件描述文件 2.向ROS注册插件 3.在costmap配置文件中使用 总结 前言 pluginlib是一个 C 库,用于从 ROS 包中加载和卸载插件。插件是从…

SpringBoot实战(十一)集成RebbitMQ

目录1.工作原理图1.1 配置阶段1.2 生产者1.3 消费者2.Maven依赖3.常用交换机类型3.1 direct 直连交换机3.2 fanout 广播交换机3.3 topic 主题交换机4.Direct 直连交换机4.1 yml配置4.2 配置类4.3 消息推送类4.4 消息监听类4.5 测试5.Fanout 广播交换机5.1 配置类5.2 消息推送类…

javascript画全年日历

前些日子闲聊群里有人提了用js画全年日历的需求,趁闲暇时间画了个小demo,下面还是先上效果图吧。 高亮显示的是今天的日期和标记要高亮显示的日期,也添加了点击事件的钩子,自己可以实现钩子函数,从而操作点击的日期值。…

综述 | 深度强化学习在自动驾驶中的应用

本文是2020年的综述论文《Deep Reinforcement Learning for Autonomous Driving: A Survey》的部分内容节选。翻译稿全文共2万6千字,本文略掉了第3、4节强化学习理论的介绍及扩展部分。摘要随着深度表征学习(deep representation learning)的发展,强化学…

【8】SCI易中期刊推荐——图像处理领域(中科院4区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…

windows下Docker部署Flask的教程

Docker默认安装路径是在C盘,Windows中修改Docker**默认安装****路径方法: 1.先创建 D:\Program Files\Docker 目录 2.运行命令,创建链接 mklink /J "C:\Program Files\Docker" "D:\codeSoftware\Docker"3.点击exe安装…

logstash 向多目标输出多份日志输出syslog

logstash默认情况下是内置了输入syslog日志的,但是不支持输出syslog,需要输出syslog的情况下,就需要手动安装logstash-output-syslog插件。安装方法如下:下载logstash-output-syslog插件,https://rubygems.org/downloa…

SpringBoot 注册自己的Servlet(三种方式)

SpringBoot 注册自己的Servlet(三种方式) 目录SpringBoot 注册自己的Servlet(三种方式)方法1:使用servlet3.0规范提供的注解方式注册Servlet1,声明servlet及映射2,加上ServletComponentScan 才会扫描加了这个注解运行结…

LeetCode 62. 不同路径

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓LeetCode 62. 不同路径,做好准备了么,那么开始吧。 🌲🌲🐴🐴 一、题目名称 LeetCode 62. …

蚂蚁智能内容合规产品,提供一站式营销合规管控解决方案

随着互联网服务的不断深化,产品营销的形式从传统文本、长图文,增加到短视频、直播等新媒介形态,展现形式愈加丰富的同时,也为营销宣传内容合规审核带来了诸多难题。如何解决与日俱增的审核量与合规审核人员有限之间的矛盾&#xf…

旧手机闲置?教你用Termux搭建个移动服务器

目录 前言 准备工作 实践 安装Termux: 运行Termux: 环境配置: 效果展示 写在最后 前言 最近偶然看到网上有人用KSWEB搭建本地服务器,于是突发奇想也想在手机中搭建一个node环境试试,趁着周末有空,…