项目目录
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
└─main
index.html
login.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尝试请求快速结束
else
next();
})
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 = 200
responseData.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//将依赖安装到开发环境