一、生产环境所需要素
- 购买自己的域名(用于映射服务器IP,IP不方便记忆)
- 购买自己的服务器(一台带外网IP的电脑)
- 域名备案
- 配置服务器应用环境(用户权限,无密码登录,NodeJS应用环境,必备依赖包,组件,转发SSL证书的生成配置,)
- 安装配置数据库
- 项目远程部署发布与更新(低层:拷贝发布,高一级:使用私密部署)
二、Node基础回顾
2.1 以node原生API来搭建一个简单服务应用
创建简单node服务
// 引入http模块
const http = require('http')
// 设置主页模板
const homePage = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Node部署</title>
</head>
<body>
<h1>hello NodeJS,这是主页</h1>
</body>
</html>
`
// 创建网络服务
http.createServer((req,res)=>{
res.statusCode=200;
res.setHeader('Content-Type','text/html')
res.end(homePage)
}).listen(3000,()=>{
console.log('服务启动成功')
})
2.2 一个node后台应用项目示例
1)、web项目
- 技术栈:express+node+mongodb
- 目录结构参考
|_ app.js
|_ app
|_ controllers // 配置针对请求的自定义中间件
|_ models // mongodb对应生成的model文件
|_ schemas // mongodb对应的不同schema
|_ views // 网页渲染模板文件(jade,ejs等)
|_ config
|_ routes.js //后端路由配置
|_ node_modules
|_ public // 前端静态资源
|_ js
|_ less
|_ libs // 前端所需类库(如boostrap,jquery等)
|_ images
|_ test
|_ .bowerrc
|_ .jshintr
|_ app.js
|_ bower.json
|_ package.json
A)在node后台中配置mongo的使用
根据以上目录结构可以看出,针对mongodb的应用,schema,models是分开的,这样才能实现多数据的操作
- 以下为缩略的伪代码
# 1- app.js中引入mongoose并创建连接mongodb的服务
var mongoose = require('mongoose')
var dbUrl = 'mongodb://localhost/mydb'
mongoose.connect(dbUrl) //连接mongodb
# 2-schema中创建各数据文档结构(例:/app/schemas/comment.js)
var mongoose = require('mongoose')
var Schema = mongoose.Schema
var CommentSchema = new Schema({ //创建一个结构
name: { type: String, default: 'hahaha' },
age: { type: Number, min: 18, index: true },
date: { type: Date, default: Date.now },
})
Comment.pre('save',function(next){
//做一些存储前的中间处理(如验证要存储的数据之类)
next()
})
Comment.statics = { //对schema添加静态方法,用于增,删,改,查的调用
fetch:function(cb){
return this.find({})
.sort()
.exec(cb)
},
findById:function(id,cb){
return this.findOne({_id:id})
.exec(cb)
}
}
model.exports = CommentSchema
# 3- models中引用schema创建model(/app/models/comment.js)
var mongoose= require('mongoose')
var CommentSchema=require('../schemas/comment')
var Comment = mongoose.model('Comment',CommentSchema) //根据结构创建模型
model.exports=Comment
# 4- Controllers中引用model并创建中间件用于对前端请求的回复(/app/controllers/comment.js)
var mongoose = require('mongoose')
var Comment = mongoose.model('Comment') //引入要使用的模型
exports.save=function(req,res){
var _comment = req.body.comment
var id = _comment.target
if(_comment.cid){
//调用shcema中定义的静态方法findById
Comment.findById(_commtn.cid,function(err,comment){
comment.save(function(err,comment){
if(err){
console.log(err)
}
res.redirect('/index')
})
})
}
}
# 5- 后端路由配置(/config/routes.js)
var User = require('../app/controllers/users')
var Comment = require('../app/controllers/comment')
model.exports=function(app){
//用户发起评论的请求——> 中间件 siginRequired能主是否登录——> 中间件Comment.save进行评论的存储
app.post('/user/comment',User.siginRequired,Comment.save)
}