node.js(express)+MongoDB快速搭建后端---新手教程

前言:

Node.js是一个基于 Chrome V8引擎的JavaScript运行环境,是对于前端工程师来说学习成本最小的后端实现方法,本篇文章总结如何从0-1写一个后端的登录接口

一、检查node环境

先检查自己的node是否安装

一般来说前端工程师的电脑环境肯定有装node吧,没有的可以去查下安装教程,非常简单,这边建议可以安装nvm,可以做到多个node版本切换 

二、创建express项目

express:

  • 一个可以快速搭建web项目的nodejs框架。
  • 初始化项目时,会自动创建项目所需各种文件夹以及文件,并配置基本的服务器信息
1、准备好一个空文件夹,用来放后端程序
2、下载安装express
npm i express-generator -g
3、创建express项目
express 项目名称
express test
注意:

如果创建项目失败,找到系统的Windows PowerShell,用管理员身份运行,打开脚本命令行窗口,输入set-ExecutionPolicy RemoteSigned回车,如果选项中有A则输入A,没有A选项,则输入y,回车后,关闭窗口,重启VSCode。

此刻可以看到文件夹里面已经生成了express框架的文件:

项目的文件解释:
  • bin:存放服务器配置文件。

      www:服务器配置文件,在其中编写服务器配置信息(没特殊情况,不允许修改)。

  • public:存放项目的公共资源。

                公共资源:可以被用户访问的资源(浏览器可以从服务器上直接请求到的资源)。

                比如:html、css、js、图片等。

  • routes:存放路由配置文件。

                 存放后端程序代码。

  • views:存放模板文件。
  • app.js:项目启动入口文件。执行该文件后,可以启动服务器,服务器启动后,项目资源就可被用户访问(浏览器请求)。
  • package.json:管理项目包的配置文件。
4、下载express项目依赖的第三方包

(这一步需要在package.json文件所属的上层文件夹中执行,需要进入刚刚创建的项目)

cd test
npm i

5、配置启动信息:
  • 删除app.js中最后一行:module.exports = app;
  • app.js中最后部分添加以下代码:(查看系统端口占用情况netstat -ano):
app.listen(端口号,服务器启动成功时调用的函数);
app.listen(3000,function(){console.log('服务器启动成功!端口号为3000');
});
6、启动服务器
node app.js
7、通过浏览器可以访问服务器资源
  • http://主机:端口号/资源路径
    • 本机:可以使用localhost127.0.0.1
    • 查看自己电脑的IPipconfig
  • http://127.0.0.1:3000/html/index.html
  • 注意:如果没指定资源路径,服务器会默认从public文件夹中查找index文件作为请求资源;
8、安装nodemon
  • 一个命令工具包,会自动检测项目中文件修改,重启服务器;

npm i nodemon -g

 以后我们启动服务器就可以用

nodemon app.js

三、准备数据库MongoDB

MongoDB是一个基于分布式文件存储的数据库,是非关系数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

它支持的数据结构非常松散,是类似jsonbson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

存储数据的方式:

  • 一个对象以一个文档的形式存在;
    • 张三的数据以一个文档形式存储;
    • 李四的数据以一个文档形式存储;
  • 一个集合负责管理存储一类对象数据。
    • 所有学生数据是以一个集合形式存储;
    • 所有班级数据是以一个集合形式存储;
1、安装数据库
  • 下载网址https://www.mongodb.com/try/download/enterprise
  • 安装mongodb时,在最后一个安装界面install MongoDB compass,去掉前面的多选框的;
2、安装图形化界面软件 Navicat

可以搜一个安装破解navicat的教程,网上很多

3、下载好navicat后建一个数据库

填入连接名,因为demo是本机运行的所以填入localhost或者127.0.0.1都可以

双击连接名后会发现颜色变了,那就证明连接成功,然后右键单击,选择新建数据库,输入你要建立的数据库名,我这里写的是test2

双击之后刚刚建好的数据库

右键集合,选择新建集合,然后点左上角的保存会弹窗,填入集合名user

然后展开集合就有了刚刚建的user ,双击user后点击左下角的加号,然后输入要建的表头

这样集合就建好了,可以自己添加,_id是集合保存时就会自动添加,这样看着虽然是表的形式,但是MongoDB是文档的形式储存的,显示成表格是为了更好操作

 右键单击每一列,可以设置该项的值类型,我们这里都设置成字符串类型

 4、在项目中安装mongoose
  • mongoose是一个可以在Nodejs环境下操作mongodb的第三方包
  • 安装mongoose后,可以使用其提供的API对mongodb数据库中的数据进行增删查改(CRUD)操作。
npm i mongoose
5、连接数据库:

新建JavaScript文件,并添加以下JavaScript代码,并配置目标数据库名称

//建立数据库连接代码
//引入mongoose模块
let mongoose=require('mongoose');
//连接数据库
//数据库的URL
let dbURL='mongodb://127.0.0.1:27017/数据库名称';
mongoose.connect(dbURL,{useNewUrlParser:true,useUnifiedTopology:true
});
//设置连接成功时要执行的回调函数
mongoose.connection.on('connected',function(){console.log('数据库连接成功!');
});

在app.js文件中引入新建的JavaScript文件

require('新建的JavaScript文件路径');

我是在新建了util文件夹,在里面写了连接数据库的js文件:

 运行后可以发现控制台输出连接成功:

四、编写后端代码 

1、编写代码前需要知道一些基础的概念:
 1.1Restful风格:

restful是一种接口的编程风格,接口的路径只用于确定操作的目标资源,以请求类型来确定对目标资源进行操作的类型。

1.2请求类型:
  • GET:获取资源
  • POST:添加资源
  • DELETE:删除资源
  • PUT:修改资源
1.3传参方式:

query、body、params:

  • query用于获取URL传参(?键1=值1&键2=值2);

  • body用于获取请求正文传参;

  • params用于获取请求路径传参;

2、准备一个简单的前端页面

简单写一个可以填入账号密码的登录框

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script></head><body><form action="" id="loginForm"><label for="acc">账号:</label><input type="text" id="acc" placeholder="请输入登录账号" /><br /><label for="pwd">密码:</label><input type="password" id="pwd" placeholder="请输入登录密码" /><br /><input type="submit" /></form></body>
</html>
 3、关联目标数据库集合

新建db文件夹,然后新增userModel.js

这个userModel.js需要建立起与数据库集合内的关系

  • 引入mongoose模块

let mongoose=require('mongoose');
  • 创建目标集合的模型对象(系统自动生成的_id不需要声明)

let 模型名称=new mongoose.Schema({
属性名称:属性类型(类型的首字母大写),
......
});
  • 建立模型对象与数据库中数据集合的关联关系

let 变量名称=mongoose.model('名称',模型对象,'目标集合名称');

对照我们之前创建的user集合就可以写成:

//引入mongoose
let mongoose = require("mongoose");
//创建目标模型对象
let userSchema = new mongoose.Schema({name: String,pwd: String,
});
//建立模型对象与集合的关联关系
let userModel = mongoose.model("userModel", userSchema, "user");
4、操作集合

先删除routes里面之前的js文件,咱们自己新建一个user.js,写一个简单的登录接口

代码如下:

这里写的是一个get请求,然后拿到前端在url上拼接的账号和密码去数据库进行校验

.find是根据指定属性值查询

var express = require("express");
var router = express.Router();//引入mongoose
let mongoose = require("mongoose");//登录
router.get("/:acc/:pwd", async function (req, res) {let { acc, pwd } = req.params;console.log(acc, pwd);//根据账号查询用户数据let re = await mongoose.model("userModel").find({name: acc,});// console.log(re);if (re.length < 1) {res.send({code: 260,message: "账号不存在!请先注册!",});} else {if (re[0].pwd == pwd) {res.send({code: 200,message: "登录成功!",});} else {res.send({code: 250,message: "密码错误!",});}}
});
module.exports = router;
5、app.js引入并配置一级路由

将我们刚刚写好的集合模型创建代码(userModel.js)和后端模块代码(users.js)都需要引入app.js里面才可以有效,

之前删掉的routes文件夹里面原来的文件,需要在app.js里面也删掉引入他们的代码

代码如下:

//引入集合模型创建代码文件
require("./db/userModel");//引入后端模块
var usersRouter = require("./routes/users");//配置一级路由
app.use("/users", usersRouter);

6、前端调用写好的后端接口


<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script><script>$(function () {$("#loginForm").on("submit", function (event) {event.preventDefault();// console.log('登录');$.ajax({url: `http://127.0.0.1:3000/users/${$("#acc").val()}/${$("#pwd").val()}`,type: "get",success: function (data) {alert(data.message);},});});});</script></head><body><form action="" id="loginForm"><label for="acc">账号:</label><input type="text" id="acc" placeholder="请输入登录账号" /><br /><label for="pwd">密码:</label><input type="password" id="pwd" placeholder="请输入登录密码" /><br /><input type="submit" /></form></body>
</html>

需要注意我们写的url上的端口号需要对应在app.js中的端口号,端口号后面是写后端已经定义好的一级路由,最后拼接账号和密码

6、解决跨域

此时大概流程就走通了,运行前端页面看看效果:

点击提交后会发现接口报错了,显示跨域

解决办法:

app.js中,在引入后端模块后设置CORS允许跨域:

var app = express();
//引入后端模块
var usersRouter = require("./routes/users");
// 设置 CORS 允许跨域
var allowCrossDomain = function (req, res, next) {// 设置允许哪一个源(域)可以进行跨域访问,* 表示所有源res.header("Access-Control-Allow-Origin", "*");// 设置允许跨域访问的请求头res.header("Access-Control-Allow-Headers","X-Requested-With,Origin,Content-Type,Accept,Authorization");// 设置允许跨域访问的请求类型res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE");// 设置允许 cookie 发送到服务器res.header("Access-Control-Allow-Credentials", "true");next();
};
app.use(allowCrossDomain);
//配置一级路由
app.use("/users", usersRouter);

至此我们再去页面看一下效果

这样一个简易的后端接口就做好了!

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

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

相关文章

六面体大米装袋机在提升大米包装效率中的作用

在当今社会&#xff0c;随着科技的飞速发展&#xff0c;各行各业都在寻求创新与突破&#xff0c;以提升生产效率和降低成本。而在大米包装领域&#xff0c;六面体大米装袋机的出现&#xff0c;无疑为整个行业带来了革命性的变化。这种先进的机械设备不仅提高了大米的包装效率&a…

【全开源】沃德校友会管理系统(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp开发的校友会综合服务平台&#xff0c;即校友信息管理平台、活动管理平台、校友服务大厅、校友企业服务平台等&#xff0c;实现集中学校、学院、校友会于一体的基础服务平台的搭建&#xff0c;建设一个满足校友信息化长期发展的、可扩展的综合校…

全面盘点多模态融合算法及应用场景

关注作者&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕博&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的资深架构师&#xff0c;项目管理专业人士&#xff0c;上亿营收AI产品研发负责人 多…

一款更加轻量级的虚拟机:Multipass

一款更加轻量级的虚拟机&#xff1a;Multipass 前言Multipass概述安装Multipassmultipass命令命令使用说明 Multipass的使用查看镜像列表新建和运行虚拟机查看虚拟机列表查看虚拟机信息进入虚拟机外部操作虚拟机删除和释放实例初始化配置虚拟机的调整设置桥接网络接口配置软件源…

Oracle dblink 发现Network 等待事件的分析 enq: KO - fast object checkpoint

所有的sql 通过dblink 查询全部等待中&#xff0c; 同一个SQL 20多个session 在跑&#xff0c;等待事件network&#xff0c;可能怀疑是不是网络断开了&#xff0c;导致没有返回 执行sql 如下&#xff1a; BEGIN Xdblink ; END; 去到dblink 所在的db&#xff0c;发现20多个sql在…

白酒:白酒产地的地域文化与品牌形象

云仓酒庄豪迈白酒&#xff0c;作为中国白酒的一部分&#xff0c;其品牌形象深受产地的地域文化影响。地域文化是一个地区与众不同的文化传统和价值观&#xff0c;它影响着当地人的生活方式和审美观念&#xff0c;进而影响白酒的品牌形象。 首先&#xff0c;白酒产地的历史与传统…

ClickHouse安装教程:开启你的列式数据库之旅

ClickHouse是一个高性能的列式数据库管理系统&#xff0c;适用于在线分析处理&#xff08;OLAP&#xff09;。以下是ClickHouse的一些基本使用步骤&#xff1a; 下载二进制文件&#xff1a;您可以通过运行以下curl命令在Linux、FreeBSD或macOS上本地下载ClickHouse&#xff1a…

Midjourney如何控制光照?提示词灵感来了!

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Midjourney如何控制光照&#xff1f;提示词灵感来了&#xff01;文章目录 前言总结 前言 Midjourney v6 已经更新好久了&#xff0c;你知道有哪些可以控制光照效果的关键词吗…

全志T527 适配双目tp2815_mipi

一、硬件信息 TP2815&#xff1a; 确认硬件信息&#xff1a; 1、通信接口&#xff1a;TWI2总线&#xff0c;引脚组为PE1 、PE2 2、RESET脚&#xff1a; 二、软件配置 1、设备树 t527 dtsi: bsp/configs/linux-5.15/sun55iw3p1.dtsi t527 uboot-board.dts device/config/chi…

重学java 49 增强for

知之俞明&#xff0c;则行之越笃&#xff1b;行之愈笃&#xff0c;则知之愈益&#xff1b; —— 24.5.28 一、基本使用 1.作用: 遍历集合或者数组 2.格式: for(元素类型 变量名:要遍历的集合名或者数组名) 变量名就是代表的每一个元素 3.快捷键: 集合名或者数组名.for package …

ESXI8.0虚拟机和主机之间进行粘贴复制

1&#xff1a;默认情况下新建一个虚拟机是无法和主机之间进行粘贴复制操作的&#xff0c;主要是为了安全。 2&#xff1a;可以参考下面的文档进行操作&#xff0c;操作成功也只能复制粘贴数据&#xff0c;而无法复制粘贴文件或文件夹 https://knowledge.broadcom.com/externa…

组建RAID后安装系统时发现无法识别硬盘!

计算环境中,RAID(独立磁盘冗余阵列)是一种广泛采用的数据存储技术,它通过组合多个物理硬盘来提升数据读写速度、增加存储容量或提供数据冗余以确保数据安全。然而,用户在使用SAS或SATA RAID阵列卡组建RAID后,可能会遇到在安装操作系统过程中硬盘无法被系统识别的问题。接…

【会议征稿,IEEE出版】第九届信息科学、计算机技术与交通运输国际学术会议(ISCTT 2024,6月28-30)

第九届信息科学、计算机技术与交通运输国际学术会议&#xff08;ISCTT 2024&#xff09;将于2024年6月28-30日在中国绵阳举行。 ISCTT 2024将围绕 “信息科学”、"计算机技术”、“交通运输” 等最新研究领域&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专…

安卓 view淡入淡出(fade in fade out) kotlin

文章目录 前言一、布局文件二、kotlin扩展方法1.fadeOutAnimation 淡出动画2.fadeInAnimation 淡入动画 三、使用总结 前言 好久没写文章了,简单码一个淡入淡出,我们先上效果图 那么接下来上代码 一、布局文件 我这边直接将activity_main.xml改为下列代码,可以看到其中包含一…

【并发程序设计】11.进程间通信

11.进程间通信 &#xff08;IPC&#xff0c;InterProcess Communication&#xff09;进程和进程之间交换信息。 常用通信方式 无名管道&#xff08;pipe&#xff09;有名管道 &#xff08;fifo&#xff09;信号&#xff08;signal&#xff09;共享内存(mmap)套接字&#xff0…

jenkins+sonarqube部署与配置过程

1、部署jenkins&#xff08;本文不做说明&#xff09; 2、部署sonarqube(docker-compose) version: "2.1"services:sonarqube:image: sonarqube:9.9.4-communitycontainer_name: sonarqubedepends_on:- dbports:- 9000:9000networks:- sonarnetenvironment:SONARQU…

C++候捷stl-视频笔记1

认识headers、版本、重要资源 STL的核心思想是泛型编程 新式头文件内的组件封装在命名空间std中&#xff1a; using namespace std; using std::cout;或std::vector vec; 旧式头文件内的组件不封装在命名空间std中 注:不建直接使用using namespace xxx&#xff0c;如果使用的…

Meterpreter工具使用

Meterpreter属于stage payload&#xff0c;在Metasploit Framework中&#xff0c;Meterpreter是一种后渗透工具&#xff0c;它 属于一种在运行过程中可通过网络进行功能扩展的动态可扩展型Payload。这种工具是基于“内存DLL注 入”理念实现的&#xff0c;它能够通过创建一个新进…

微乐校园管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;基础数据管理&#xff0c;叫车管理&#xff0c;代跑管理&#xff0c;二手商品管理 司机账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;叫车管理&#xff0c…

【Linux进程篇】Linux内核——程序地址空间的初构

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 程序地址空间回顾 我们在讲C语言的时候&#xff0c;大家应该都见过这样的空间布局图&#xff1a; 为了更好的验证不同的数据在内存中的存储位置&#xff0c;下面这段代码我们可以去实验一下&#xff1a; #include<…