项目目录

G:\FIR_NODE_APP
│  app.js//入口文件
│  package.json//第三方依赖包管理文件,在根目录下运行cnpm init就有此文件
├─models
│      User.js//模型类(本案例以mongodb作为数据库,mongodb以模型类操作数据库)
├─public//静态文件包
│  │  main.css//css样式
│  └─js
│          index.js//处理html页面的业务逻辑
│          jquery-3.2.1.js
│          login.js
│
├─routers
│      admin.js
│      api.js//接口文件
│      main.js//页面的路由
├─schemas
│      users.js//mongoose.schema类,上面User.js就是基于此类进行操作,通过模型化该类进行数据库的增删改查
└─views└─mainindex.htmllogin.html//页面
下面截个图更清楚目录结构

前期准备

要自行安装mongodb数据库和可视化工具,我用的可视化工具是Robo 3T 1.3.1(需要教程的请留言,过后给您献上博文)

开始上代码

app.js
let express = require('express')//在这里引入前要安装express,cnpm i express -S
let swig = require('swig')//安装swig,cnpm i swig -S
let mongoose = require('mongoose')//安装mongoose,cnpm i mongoose -S
let bodyParser = require('body-parser')//安装body-parser,cnpm i body-parser -S
// 解析 application/json,app.use(bodyParser.json());
// 解析 application/x-www-form-urlencoded,app.use(bodyParser.urlencoded());
let app = express()//创建应用
// app.use(bodyParser.json)
app.all("*",function(req,res,next){//设置允许跨域的域名,*代表允许任意域名跨域res.header("Access-Control-Allow-Origin","*");//允许的header类型,TOKEN或其他自定义登录态要在这里配置一下,前端才可以传递到后端来res.header("Access-Control-Allow-Headers","content-type,TOKEN");//跨域允许的请求方式 res.header("Access-Control-Allow-Methods","DELETE,PUT,POST,GET,OPTIONS");if (req.method.toLowerCase() == 'options')res.send(200);  //让options尝试请求快速结束elsenext();
})
app.engine('html',swig.renderFile)//html是处理的文件类型
app.set('views','./views')//./views就是html文件存放的地方
app.set('view engine','html')//html与上面的html要保持一直
app.use('/public',express.static(__dirname+'/public'))//静态文件存储的地方
swig.setDefaults({cache:false//页面不缓存
})
app.use(bodyParser.urlencoded({extended:true//后端获取前端的请求体,这样就可以通过req.body来获取前端传过来的数据
}))
app.use('/admin',require('./routers/admin'))//配置路由的路径
app.use('/api',require('./routers/api'))
app.use('/',require('./routers/main'))
// app.get('/',function(req,res,next){//通过app应用的方式配置路由
//     res.render('main/index')
// })
//<link rel="stylesheet" type="text/css" href="/main.css">
// app.get('/main.css',function(req,res,next){//     res.setHeader('content-type','text/css');
//     res.send('body{background:red;}');
// })
mongoose.connect("mongodb://localhost:27017/config",{useNewUrlParser:true},function(err){//通过mongodb连接数据库,这里的config是数据库的名称,无需先创建,在连接的时候如果没有这个数据库,就会自动创建if(err){console.log("连接失败")}else{console.log("连接成功")app.listen(2000)}
})

User.js

var mongoose = require('mongoose')
var usersSchema = require('../schemas/users')//引入类
module.exports = mongoose.model('User',usersSchema)//模型化,通过此模型进行增删改查

index.js

$(function(){let timer$('input[type=button]').on('click',function(){$.ajax({type:'post',url:'/api/user/register',data:{username:document.getElementById('userName').value,//也可以通过jq的方式获取输入的内容password:document.getElementById('psd').value,conPsd:document.getElementById('conPsd').value},dataType:'json',success:(res)=>{$('.dialog')[0].innerHTML = res.message$('.dialog').css("display","inline-block")timer = setTimeout(() => {$('.dialog').css("display","none")clearTimeout(timer)}, 800);if(res.code==200){window.open('http://127.0.0.1:8088/login','_self')}}})})
})

admin.js

let express = require('express')
let router = express.Router()//通过router配置路由,像上面一样,也可以通过app = express()来配置路由
router.get('/user',function(req,res,next){res.send('User')//向客户端发送数据
})
module.exports = router

api.js

var axios = require('axios')//安装axios,cnpm i axios -S
var express = require('express')
var router = express.Router()
var User = require('../models/User')//引入模型
var responseData;
router.use(function (req, res, next) {//三个参数莫漏掉responseData = {//默认返回的数据code: 0,message: ''}next()//不要漏了这个,漏了前后端就无法联系
})
router.get('/getusers',function(req,res){let users = User.find().then(result=>{//User模型就是一张表,在mongo中叫集合,行叫文档,增删改查每一行/条数据叫操作文档responseData.message = result//将数据库表中的所有users用户返回给前端res.json(responseData)})
})
router.post('/user/accross', function (req, res, next) {axios.post('http://www.baidu.com').then(result => {responseData.code = 200responseData.message = "result"res.json(responseData)//在router中再次发起axios请求,这是在服务器中发起的请求,服务器与服务器的请求没有跨域问题,更多知识可以去了解一下同源策略})
})

main.js

var express = require('express')
var router = express.Router()
router.get('/',function(req,res,next){res.render('main/index')//页面路由
})
router.get('/login',function(req,res,next){res.render('main/login')
})
module.exports = router

users.js

var mongoose = require('mongoose')
module.exports = new mongoose.Schema({username:String,password:String
})//这个类也就是数据库的一张表

其他知识

初学着可能有一个问题,cnpm i axios -S中的S到底是什么意思
-S也等于–save-dev//将依赖安装到上线环境和开发环境
-D也等于-dev//将依赖安装到开发环境

以上就是本教程的所有内容,如有其他疑问的敬请留言,谢谢支持

nodejs实战入门教程相关推荐

  1. python全栈工程师 pdf_python全栈工程师项目开发实例实战入门教程百度云

    python全栈工程师项目开发实例实战入门教程百度云 课程目录: 开学典礼 pycharm的基本使用 Python基本语法 数值类型数据及运算 字符串的基本操作 字符串的常用方法 列表的基本使用 列表 ...

  2. python爬虫入门教程pdf-Python爬虫实战入门教程.pdf

    Python 爬虫实战入门教程 州的先生 <Python 爬虫实战入门教程> 作者:州的先生 微信公众号:州的先生 博客: 2018/3/24 1 Python 爬虫实战入门教程 州的先生 ...

  3. Nodejs 快速入门教程

    node.js入门教程 nodejs和npm的安装 体验一下 Hello World 之 Node.js 基础之Npm使用 Node之模块 熟悉常用的内置模块 express框架 1. nodejs和 ...

  4. 一个颜值低但脾气超好的自动化运维实战入门教程

    注:本教程由廖高祥发布于实验楼,版权归原作者所有. 什么是自动化运维? 自动化运维是指将IT运维中日常的.大量的重复性工作自动化,把过去的手工执行转为自动化操作.自动化运维不单纯是一个维护过程,更是一 ...

  5. 推荐个NodeJS的入门教程 — Node入门/nodebeginner

    介绍 传送门在这里 >> Node入门 说明 教程内容是很高级且简短,即少我学完后可以用Nodejs写个本地mock服务器,用于API的mock测试 该教程一边由浅入深的介绍Nodejs的 ...

  6. 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-2

    来个目录吧: 第一章-入门 第二章- Entity Framework Core Nuget包管理 第三章-创建.修改.删除.查询 第四章-排序.过滤.分页.分组 第五章-迁移,EF Core 的co ...

  7. Java Servlet 实战入门教程-10-servlet 过滤器 Filter

    过滤器 概念 Filter(过滤器)是 Java 组件,允许运行过程中改变进入资源的请求和资源返回的响应中的有效负载和头信息. Java Servlet API 类和方法提供了一种轻量级的框架用于过滤 ...

  8. bootstrape实战案例_bootstrap 实战入门教程(一)

    说起响应式前端框架,比较而言,bootstrap还是不错的,虽然可能很多文档都是英文的.今天就整理下自己在学习及使用bootstrap3时的重要知识点和使用案例 参考资料: 1. 简介 Bootstr ...

  9. Node.js 官网入门教程(二) npm(安装、包版本、卸载、npx)、package.json(scripts、devDependencies)package-lock.json(语义版本规则符号

    Node.js 官网入门教程(二) npm(包管理.安装.包版本.卸载.npx).package.json(scripts.devDependencies).package-lock.json(语义版 ...

最新文章

  1. Python自动化之YAML解析
  2. 面试题 合并两个有序链表
  3. IDEA2021.1.2版创建Java Web项目并配置Tomcat
  4. 【FHQ treap】维护书架(金牌导航 无旋式treap-1)
  5. 次短路 Yen氏算法 凸包
  6. React-Native测试报告
  7. Hybrid 通信方式
  8. php在图片左上角加入水印,如何在PHP中将图像添加到图像上,如水印
  9. 蓝桥杯2016年第七届C/C++A组省赛第二题-生日蜡烛
  10. 主流NoSQL数据库评测之HandlerSocket
  11. linux怎么生成arm文件,Linux下ffmpeg转换工具配置(MP3和AMR格式文件互转).docx
  12. CMM(Capability Maturity Model) 能力成熟度模型
  13. VBA综合应用——解压并剔除Excel敏感数据
  14. The Social-Engineer Toolkit(社会工程学套件)全网第一篇套件全模块讲解
  15. vue中使用canvas手写输入识别中文
  16. StateFlow 状态流
  17. 隐藏与显示桌面上的单个图标
  18. 数据结构的在C语言中的类型定义
  19. This old-style function definition is not preceded by a prototype
  20. Redis启动、停止、查看

热门文章

  1. 从0开始搭建数据库网站
  2. 【AIS学习】03:A级与B级区别
  3. Window10专业版 激活
  4. 服务器关闭客户端连接操作
  5. centos 安装指定版本gdb
  6. mybatis RowBounds
  7. 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第一节:3D时代来临!
  8. 开源工作流框架 workflow-core 的学习和使用
  9. 虚拟环境的作用及搭建
  10. Collectors.reducing总结Collectors.mapping+Collectors.reducing+TreeSet等等