【无标题】nodejs+mogoodb数据库写注册接口

描述

本篇文章主要记录使用nodejs + express搭建服务器,并链接mogoodb数据来书写简单的后台接口;前端项目使用的vue2的一个酒店管理项目。阅读本文章,可以了解如何连接mogoodb数据库,和一些对数据库进行操作的命令。前端如何进行跨域请求,在请求后端接口时的一些注意点。

后台项目介绍

在这里插入图片描述
这里主要介绍mogoodb数据库的连接与操作命令,对于项目其他文件就不在赘述,主要讲解有关连接mogoodb数据所涉及到的文件。
1、打开cmd,输入mongod启动数据库(请不要关掉黑窗口)
1、重新打开一个新的cmd,输入mongo(请不要关闭黑窗口)

bin/www

这里主要是搭建服务器。在本地启动该服务器,监听的端口是4000。

var app = require('../app');
var debug = require('debug')('mgserver:server');
var http = require('http');/*** normalizePort()规范化端口,一般端口号可以从环境中获取,或者默认3000*/
var port = normalizePort(process.env.PORT || '4000');
app.set('port', port);/*** 创建http服务*/
var server = http.createServer(app);/*** 监听端口号* server.on('error', onError) 这行代码添加了一个事件监听器,用于处理服务器启动过程中可能出现的错误。当服务器启动过程中发生错误时,会触发 error 事件,然后调用 onError 函数进行处理。* server.on('listening', onListening); 这行代码添加了一个事件监听器,用于处理服务器成功启动并开始监听指定端口的情况。当服务器成功开始监听指定端口时,会触发 listening 事件,然后调用 onListening 函数进行处理。*/server.listen(port);
server.on('error', onError);
server.on('listening', onListening);/***将端口规范化为数字、字符串或false。port = parseInt(val, 10); 这是 JavaScript 中的一个函数,用于将字符串转换为整数。它接受两个参数,第一个参数是要转换的字符串,第二个参数是表示要转换的进制数,这里的 10 表示使用十进制数进行转换。*/function normalizePort(val) {var port = parseInt(val, 10);if (isNaN(port)) {// named pipe  可能是一种命名管道(named pipe)形式return val;}if (port >= 0) {// port numberreturn port;}return false;
}/*** Event listener for HTTP server "error" event.* 监听http服务error的事件*/function onError(error) {//这行代码判断错误对象 error 的 syscall 属性是否等于 'listen'。在 Node.js 中,当一个错误发生时,通常会包含一个 syscall 属性,用于指示发生错误的系统调用。如果发生的错误不是由监听系统调用引起的,那么就会执行接下来的操作。if (error.syscall !== 'listen') {throw error;}var bind = typeof port === 'string'? 'Pipe ' + port: 'Port ' + port;// handle specific listen errors with friendly messagesswitch (error.code) {case 'EACCES':  // 如果错误代码是 'EACCES',表示出现了权限不足的错误。在这种情况下,代码会输出错误信息并退出进程,返回一个非零的退出码(1),以表示启动失败。console.error(bind + ' requires elevated privileges');process.exit(1);break;case 'EADDRINUSE': //如果错误代码是 'EADDRINUSE',表示端口已被占用。在这种情况下,代码同样会输出错误信息并退出进程。console.error(bind + ' is already in use');process.exit(1);break;default:throw error;}
}/*** Event listener for HTTP server "listening" event.* 监听http服务listening事件*/function onListening() {var addr = server.address();var bind = typeof addr === 'string'? 'pipe ' + addr: 'port ' + addr.port;debug('Listening on ' + bind);
}
db/index.js
var mongoose = require('mongoose');
//链接数据库,数据库的默认端口是27017;Mango为
mongoose.connect("mongodb://127.0.0.1:27017/Mango"); var db = mongoose.connection;
db.on('error',console.error.bind(console,'connection error:'));
db.once('open',function(){console.log('数据库连接成功');
})// 注册模块
var userSchema = new mongoose.Schema({username : String,//用户名password : String,//登录密码
})
var User = mongoose.model("users",userSchema)
module.exports = {User
}   

mongodb:// 是连接 MongoDB 的协议。
127.0.0.1 是本地主机的 IP 地址,表示连接到本地计算机上运行的 MongoDB 服务器。如果 MongoDB 服务器运行在不同的主机上,你需要将 IP 地址替换为相应主机的 IP 地址。
27017 是 MongoDB 默认的端口号。
Mango 是数据库的名称。如果该数据库不存在,MongoDB 将会自动创建它。

router/user/User.js

这里写一个注册的接口

var express = require('express');
var { User } = require('../../db');
var router = express.Router();
// 注册模块
router.post('/register',function(req,res,next){let form = req.body;User.find( form ).then(rel =>{if(rel.length > 0){res.json({code : 0,message : '用户名已存在'})}else{User.create( form ).then(rel =>{if(rel){res.json({code : 0,message : '注册成功'})}else{res.json({code : 1,message : '注册失败'})}})}}).catch(err =>{console.error(err)res.json({code : 0,message : '注册时出现异常'})})
})module.exports = router;
app.js
var createError = require('http-errors');
var express = require('express');
var app = express();
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');  //日志
var cors = require('cors') //  为了能在前端调用,必须实现跨域,我们采用Node.js里的cors模块在后端实现跨域   npm install cors --save
require("./db/index.js")
// var indexRouter = require('./router/index');// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');app.use(cors()) // 调用cors模块,允许跨域
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));const userRouter = require('./router/user/User.js');
//注意这里路由可以是随意写,但是需要注意的地方是,在前端进行请求时,例如:XXXX/user/register的访问接口,如果这里的路由是:/api/user,则前端访问的接口就是:XXXX/api/user/register。总的来说就是,这里use定义的路由 + User.js中post那里定义的路由,就是前端要访问的路由。
app.use( "/user", userRouter)
// catch 404 and forward to error handler
app.use(function(req, res, next) {next(createError(404));
});// error handler
app.use(function(err, req, res, next) {// set locals, only providing error in developmentres.locals.message = err.message;res.locals.error = req.app.get('env') === 'development' ? err : {};// render the error pageres.status(err.status || 500);res.render('error');
});module.exports = app;

前端项目

跨域

因为后端的域名和端口会不一样,所以需要前端配置允许跨域,在项目中找到vue.config.js文件,这里我使用proxy来实现跨域

  devServer:{ // 开发环境的相关的配置static: {directory: path.join(__dirname, 'public'), // 静态资源目录}, proxy: {'/api': {target: 'http://localhost:4000', // 实际请求的后端地址changeOrigin: true,pathRewrite: {'^/api': '' // 重写请求地址,将/api开头的路径替换为空},logLevel: 'debug'}}},

request.js文件中

重置axios请求,实现请求拦截功能

// axios请求拦截相关配置
import NProgress from 'nprogress';  // 导入前先安装npm install nprogress --save
import 'nprogress/nprogress.css'
import BASE_URL from '../../config/index'
import axios from 'axios'
const instance = axios.create({baseURL: BASE_URL,timeout: 5000,headers: {// 'token': sessionStorage.getItem('token'),// 'Access-Control-Allow-Origin':'*'} //请求接口时带上token});// 添加请求拦截器
instance.interceptors.request.use(function (config) {// 在发送请求之前做些什么NProgress.start()return config;
}, function (error) {// 对请求错误做些什么NProgress.done()return Promise.reject(error);
});// 添加响应拦截器
instance.interceptors.response.use(function (response) {// 2xx 范围内的状态码都会触发该函数。// 对响应数据做点什么NProgress.done()return response;
}, function (error) {// 超出 2xx 范围的状态码都会触发该函数。// 对响应错误做点什么NProgress.done()return Promise.reject(error);
});let get = async function(url,params){
let {data} = await instance.get(url,params)
return data
}
let post =async function(url,params){let {data} = await instance.post(url,params)return data
}// 创建一个将token信息保存到请求头的方法
let setToken = () => {instance.defaults.headers.common['token'] = '123'
}
export {get , post,setToken
}

myPlugin.js文件

这里实现一个简单的插件,使用vue的mixin混入,将get请求和post请求等方法混入到vue中,这样在任何组件中都可以使用this.$get()来访问get方法,同理mixin混入的方法都能用this访问到

/* eslint-disable no-unused-vars */
/* eslint-disable no-undef */
import {get, post,setToken} from '../utils/request'//定义一个插件
export default {// 插件中,必须包含一个install方法install: function(Vue){// 给vue混入成员Vue.mixin({methods:{$get(url,params){return get(url,params)},$post(url,params){return post(url,params)},$setToken(){// 执行该方法,就会将浏览器缓存里面的token信息存到ajax的请求头中setToken()},// 成功消息框$msg_s(message,duration=3000){this.$message({// 显示关闭图标showClose:true,message,type:"success",duration})},// 警告消息框$msg_w(message,duration=3000){this.$message({// 显示关闭图标showClose:true,message,type:"warning",duration})},// 错误消息框$msg_e(message,duration=3000){this.$message({// 显示关闭图标showClose:true,message,type:"error",duration})},// 确认框$con_f(message){return this.$confirm(message).then( res => {return true}).catch((_) => {});}}})}
}

registerView.vue组件中

在注册页面中,输入登录名和登录密码,点击确认按钮时,调用后台的接口/user/register。这里的api是proxy配置跨域时的重写,不是后台接口app.use()定义的接口出现的api,这里不要搞混了。如果后台app.js中app.use( "/api/user", userRouter)这样定义,则前端访问时应该:let res = await this.$post('/api/api/user/register',this.loginForm)

submitForm(formName) {this.$refs[formName].validate(async(valid) => {if (valid) {let res = await this.$post('/api/user/register',this.loginForm);// this.$router.push('/login')} else {return false;}});},

查看数据库中注册的用户信息

在这里插入图片描述
点击上图,打开mogoodb;

在这里插入图片描述
以上便是注册的用户信息。

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

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

相关文章

RISC-V特权架构 - 模式切换与委托

RISC-V特权架构 - 模式切换与委托 1 导致模式切换的常见动作2 异常处理规则3 异常处理时模式切换3.1 在U模式下,发生异常3.2 在S模式下,发生异常3.3 在M模式下,发生异常 4 系统调用时模式切换5 中断处理时模式切换 本文属于《 RISC-V指令集基…

图像处理环境配置opencv-python

下载python,配置pip使用清华源下载镜像: pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 切换到python目录下,右击cmd,执行pip升级指令: python -m pip install --upgrade pip 下载opencv&#x…

西圣、万魔、倍思开放式耳机值不值得买?测评对比探讨!

自开放式耳机问世以来,便凭借其独特魅力赢得了众多音乐爱好者的青睐。它不仅佩戴起来舒适无比,还能让用户随时聆听周围的环境声音,保持与外界的沟通。同时,在卫生方面也有着不俗的表现。相较于传统的入耳式耳机,这些优…

uniapp使用npm命令引入font-awesome图标库最新版本并解决APP和小程序不显示图标的问题

uniapp使用npm命令引入font-awesome图标库最新版本 图标库网址:https://fontawesome.com/search?qtools&or 命令行: 引入 npm i fortawesome/fontawesome-free 查看版本 npm list fortawesome在main.js文件中: import fortawesome/fo…

嵌入式Linux系统调用执行基本流程

内核态与用户态 什么是系统调用 系统调用是怎么实现的 库函数write 库函数扩展汇编宏 int 0x80中断 调用对应的中断处理函数 检索系统调用函数表 最终执行sys_write 内核态与用户态数据交互 内核态与用户态 早期工程师们在操作系统上编写程序的时候,自己写个程序可以访问别人…

3.5、文本显示(Text/Span)

创建文本 Text 可通过以下两种方式来创建: string 字符串 效果图 Text(我是一段文本)引用 Resource 资源 资源引用类型可以通过 $r 创建 Resource 类型对象,文件位置为 /resources/base/element/string.json。 引用的资源位于:src/main/resources/base/element/string…

红酒:按年份分类,探究不同类型红酒的品质

在红酒的世界里,年份是一个至关重要的因素,它对红酒的品质和价值有着深远的影响。云仓酒庄雷盛红酒深知这一点,从酿造的首年起,就严格把控每一个环节,力求为消费者提供品质的红酒。 首先,让我们了解一下什么…

飞企互联-FE企业运营管理平台 druid路径 弱口令漏洞复现

0x01 产品简介 飞企互联-FE企业运营管理平台是一个基于云计算、智能化、大数据、物联网、移动互联网等技术支撑的云工作台。这个平台可以连接人、链接端、联通内外,支持企业B2B、C2B与O2O等核心需求,为不同行业客户的互联网+转型提供支持。 0x02 漏洞概述 飞企互联-FE企业…

ctf刷题记录2(更新中)

因为csdn上内容过多编辑的时候会很卡&#xff0c;因此重开一篇&#xff0c;继续刷题之旅。 NewStarCTF 2023 WEEK3 Include &#x1f350; <?phperror_reporting(0);if(isset($_GET[file])) {$file $_GET[file];if(preg_match(/flag|log|session|filter|input|data/i, $…

QT----opencv4.8.0编译cuda版本,QTcreater使用

目录 1 编译opencv4.8.02 验证能否加载GPU cuda12.1 opencv4.8.0 vs2019 cmake3.29 1 编译opencv4.8.0 打开cmake&#xff0c;选择opencv480路径&#xff0c;build路径随意 点击configure后&#xff0c;选择这些选项&#xff0c;opencv_word&#xff0c;cuda全选&#xff0c;…

Java环境变量配置说明

1、右键点击“此电脑”&#xff0c;选择“属性”项。 2、点击“高级系统设置”&#xff0c;在弹出的系统属性框中&#xff0c;选择“高级”选项卡&#xff08;默认即显示该选项卡&#xff09;&#xff0c;点击“环境变量”。 3、在弹出的“环境变量”框&#xff0c;中选择下方…

酷开科技不断深耕智能电视领域,用酷开系统带给消费者更多可能性

在这个网络快速发展的时代&#xff0c;电视行业也发生了巨大变革。与以往单纯的“看”电视不同&#xff0c;人们不再满足于现有的状态&#xff0c;消费者对电视娱乐的追求更加丰富&#xff0c;这也就带给智能电视产业无限的发展可能。酷开科技瞄准这一产业趋势&#xff0c;不断…

K8S - Service简介和 1个简单NodePort例子

大纲图 流量方向 如上图&#xff0c; 当用户or 别的service 从k8s 集群外部访问 集群内的services 流量方向有两种 一种是垂直方向&#xff0c; 通过域名 -> Load Balancer -> gateway -> services , 在k8s 一般是通过ingress 来实现&#xff0c; 而ingress 不是本文…

面试经典150题——删除链表的倒数第 N 个结点

1. 题目描述 2. 题目分析与解析 这个题目整体来讲还是比较简单的&#xff0c;因此直接给出解题思路&#xff1a; 遍历链表计数 计算要删除的节点的位置 创建虚拟头节点 创建指针指向虚拟头节点 移动指针到要删除的节点的前一个节点 删除节点 返回头节点 3. 代码实现 …

IDEA new ui 找不到evaluate

问题 idea升级新版本之后&#xff0c;发现熟悉的evaluate不见了&#xff0c;只能通过快捷键启动&#xff0c;未免太麻烦了&#xff0c;如何像旧版一样添加图标直接点呢&#xff1f; 解决方案 打开debug窗口&#xff0c;在这个地方右键&#xff0c;然后选择add actions 搜索…

LLM端侧部署系列 | 如何将阿里千问大模型Qwen部署到手机上?实战演示(下篇)

引言 简介 编译Android可用的模型 转换权重 生成配置文件 模型编译 编译apk 修改配置文件 绑定android library 配置gradle 编译apk 手机上运行 安装 APK 植入模型 效果实测 0. 引言 清明时节雨纷纷&#xff0c;路上行人欲断魂。 小伙伴们好&#xff0c;我是《小…

VAR模型(二)结婚率的影响因素分析

本文研究分析了普通本专科毕业人数、城乡居民人民币储蓄存款年底余额对结婚率的影响。以计量经济学中VAR模型为主要分析模型,建立了结婚率的多元回归模型。分析了普通本专科毕业人数、城乡居民人民币储蓄存款年底余额和结婚率现状。并且对未来结婚率进行了预测。 1.理论模型和…

C语言面试题之化栈为队

化栈为队 实例要求 C语言实现实现一个MyQueue类&#xff0c;该类用两个栈来实现一个队列&#xff1b;示例&#xff1a; MyQueue queue new MyQueue();queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false说明&…

NCI SEER breast cancer美国国立癌症研究所数据库乳腺癌生存分析和乳腺癌预测模型(2024年新项目)

​作者Toby&#xff0c;来源公众号&#xff1a;python生物信息学,美国国立癌症研究所数据库乳腺癌生存分析和乳腺癌预测模型 NCI美国国立癌症研究所(NationalCancerInstitute,NCI) 美国国立癌症研究所&#xff08;NCI&#xff09;是美国国家卫生研究院&#xff08;NIH&#xf…

USACO 2024 Open Bronze铜组题解

迟到了一个月的题解...... Logical Moos: 啊这题放在铜组T1雀食有点BT...... 首先&#xff0c;我们关注l前第一和r最后那两组。如果这俩有一个是true&#xff0c;那答案肯定也是true。 否则&#xff0c;在l和r外边的都是false。那我们就只用仔细看l和r中间的玩意儿。对于l和…