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

news2024/11/17 14:26:55

前言:

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.coloradmin.cn/o/1712388.html

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

相关文章

长安链使用Golang编写智能合约教程(二)

本篇说的是长安链2.3.的版本的智能合约&#xff0c;虽然不知道两者有什么区别&#xff0c;但是编译器区分。 教程三会写一些&#xff0c;其他比较常用SDK方法的解释和使用方法 编写前的注意事项&#xff1a; 1、运行一条带有Doker_GoVM的链 2、建议直接用官方的在线IDE去写合…

【机器学习】Pandas中to_pickle()函数的介绍与机器学习中的应用

【机器学习】Pandas中to_pickle()函数的介绍和机器学习中的应用 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#…

【Android】【netd】网络相关调试技巧

网络调试技巧总结 ifconfig ifconfig 查看网卡信息 ifconfig -S tcpdump tcpdump -i any -n icmp 查看流量出入ip addr 上面的log 以及ifcong -S 信息可以知道&#xff0c;当前是从wlan0 网卡请求数据。 iptable iptable 部分指令 //禁止www.baidu.com 网址流量进入&a…

网易面试:手撕定时器

概述&#xff1a; 本文使用STL容器-set以及Linux提供的timerfd来实现定时器组件 所谓定时器就是管理大量定时任务&#xff0c;使其能按照超时时间有序地被执行 需求分析&#xff1a; 1.数据结构的选择&#xff1a;存储定时任务 2.驱动方式&#xff1a;如何选择一个任务并执…

在HTML和CSS当中运用显示隐藏

1.显示与隐藏 盒子显示:display:block;盒子隐藏: display:none:隐藏该元素并且该元素所占的空间也不存在了。 visibility:hidden:隐藏该元素但是该元素所占的内存空间还存在&#xff0c;即“隐身效果”。 2.圆角边框 在CSS2中添加圆角&#xff0c;我们不得不使用背景图像&am…

redis面试知识点

Redis知识点 Redis的RDB和AOF机制各是什么&#xff1f;它们有什么区别&#xff1f; 答&#xff1a;Redis提供了RDB和AOF两种数据持久化机制&#xff0c;适用于不同的场景。 RDB是通过在特定的时刻对内存中的完整的数据复制快照进行持久化的。 RDB工作原理&#xff1a; 当执行…

Python 机器学习 基础 之 无监督学习 【聚类(clustering)/k均值聚类/凝聚聚类/DBSCAN】的简单说明

Python 机器学习 基础 之 无监督学习 【聚类&#xff08;clustering&#xff09;/k均值聚类/凝聚聚类/DBSCAN】的简单说明 目录 Python 机器学习 基础 之 无监督学习 【聚类&#xff08;clustering&#xff09;/k均值聚类/凝聚聚类/DBSCAN】的简单说明 一、简单介绍 二、聚类…

Vue3兼容低版本浏览器(ie11,chrome63)

1、插件安装 为了使你的项目兼容 Chrome 63&#xff0c;你需要确保包含适当的 polyfills 和插件配置。你已经在使用 legacy 插件&#xff0c;但在代码中可能缺少一些配置或插件顺序有问题。以下是几个可能的改进&#xff1a; 安装 vitejs/plugin-legacy 插件&#xff1a; 确保…

Midjourney保姆级教程(五):Midjourney图生图

Midjourney生成图片的方式除了使用文字描述生成图片外&#xff0c;还有“图生图”的方式&#xff0c;可以让生成的图片更接近参考的图片。 今天我们来聊聊“图生图”的方式。 一、模仿获取propmt 很多时候&#xff0c;我们不知道画什么内容的图片&#xff0c;大家可以关注内…

一款拥有15000+POC漏洞扫描工具

1 工具介绍 0x01 免责声明 请勿使用本文中所提供的任何技术信息或代码工具进行非法测试和违法行为。若使用者利用本文中技术信息或代码工具对任何计算机系统造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责。本文所提供的技术信息或代码工具仅供于学习&am…

vue3快速上手笔记(尚硅谷)

[TOC]# 1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年10月&#…

经典必读:智能制造数字化工厂建设方案

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 战略背景&#xff1a;响应《中国制造2025》及"…

Kibana使用教程

Kibana使您能够轻松地向Elasticsearch发送请求&#xff0c;并以交互方式分析、可视化和管理数据。 1.安装 1.1 docker安装Kibana 如果你还没安装Elasticsearch&#xff0c;先执行docker安装Elasticsearch&#xff0c;下面是单机部署。 创建一个ES网络&#xff1a; docker n…

idea视图中顶部菜单栏找不到VCS

问题描述 idea视图中顶部菜单栏找不到VCS&#xff1a; 解决方案&#xff1a; 直接选择配置过git&#xff0c;此处操作&#xff1a; File->Settings->Version Control-> 点击 ->选择项目->VCS选择none ->点击apply -> 点击ok&#xff1a;

怎样修改库包的文件名?

python中&#xff0c;安装crypto模块时&#xff0c;会遇到crypto文件夹都是小写字母的情况&#xff0c;引用时又是首字母大写&#xff0c;这个时候&#xff0c;需要把库包文件名首字母改为大写字母。windows中一般的文件名命名中字母的大小写是不进行区分的&#xff0c;但是在p…

期权具体怎么交易详细的操作流程?

期权就是股票&#xff0c;唯一区别标的物上证指数&#xff0c;会看大盘吧&#xff0c;交易两个方向认购做多&#xff0c;认沽做空&#xff0c;双向t0交易&#xff0c;期权具体交易流程可以理解选择方向多和空&#xff0c;选开仓的合约&#xff0c;买入开仓和平仓没了&#xff0…

win10如何查看本机ip地址?三招搞定,快来试试吧

在数字化时代&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;对于计算机使用者来说具有重要意义。无论是为了进行网络设置、远程连接&#xff0c;还是解决网络问题&#xff0c;了解如何查看本机IP地址都是一项必备技能。对于使用Windows 10操作系统的用户来说&#xff0…

Idea工具的使用技巧与常见问题解决方案

一、使用技巧 1、启动微服务配置 如上图&#xff0c;在编辑配置选项&#xff0c;将对应的启动入口类加进去&#xff0c; 增加jvm启动参数&#xff0c; 比如&#xff1a; -Denvuat 或者 -Denvuat -Dfile.encodingUTF-8 启动配置可能不是-Denvuat&#xff0c;这个自己看代…

媒体邀约资源报道(重庆邀约媒体)

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 重庆拥有电视台、广播电台、报纸、杂志以及网络媒体等多种丰富的媒体资源&#xff0c;企业和机构可以根据自身需求和活动特点选择合适的媒体进行邀约合作。以下是重庆地区的一些主要媒体…

全球十大体育赛事API服务

体育赛事API汇总&#xff1a; Broadage全球橄榄球赛事数据Broadage全球棒球赛事数据Broadage全球篮球实时数据Broadage全球冰球赛事数据Broadage全球排球实时数据TennisApi全球网球赛事讯息Broadage全球足球实时数据棒球数据【纳米数据】