安装node的教程上网一大把,这里就不细说了,建议使用nvm安装,能够随时切换node版本。node
在这里使用Homebrew安装mongodb,首先更新Homebrew:git
brew update
mongodb提供3种版本供安装:普通版、支持TLS/SSL版本和开发版,具体请参见mongodb官网。普通版本安装执行如下指令:es6
brew install mongodb
从终端信息得知,无论安装的是哪一种版本,都会安装依赖openssl。
各个部分默认的安装路径是:github
The databases are stored in the /usr/local/var/mongodb/ directory
The mongod.conf file is here: /usr/local/etc/mongod.conf
The mongo logs can be found at /usr/local/var/log/mongodb/
The mongo binaries are here: /usr/local/Cellar/mongodb/[version]/binmongodb
一、配置数据库:
首先建立保存数据的文件夹:shell
sudo mkdir -p /data/db
而后给刚建立的文件夹写入数据权限:数据库
sudo chown -R $USER /data/db
R是recursive递归的意思
若是想直接配置mongod.conf:express
nano /usr/local/etc/mongod.conf
能够看到mongod.conf内容以下:npm
systemLog: destination: file path: /usr/local/var/log/mongodb/mongo.log logAppend: true storage: dbPath: /usr/local/var/mongodb net: bindIp: 127.0.0.1
注意:若是准备链接非本机环境的mongodb数据库,bind_ip = 0.0.0.0,而且经过homebrew安装的mongodb不须要配置环境变量了,直接运行命令就行!json
二、启动mongod服务:
mongod
使用此命令启动mongod会发现输出信息以下:
2016-06-13T10:25:09.929+0800 I CONTROL [initandlisten] MongoDB starting : pid=5693 port=27017 dbpath=/data/db 64-bit host=MacBookPro ......
能够看到,会使用默认的数据保存路径/data/db。但是/usr/local/etc/mongod.conf这个配置文件中的默认dbpath不是/usr/local/var/mongodb吗?难道说配置文件没有生效?
没错,以上启动命令并不会读取/usr/local/etc/mongod.conf。这是由于不经过$ mongod --config xxx.conf这种形式指定配置文件xxx.conf时mongodb会使用程序内置的默认配置,该配置对应的数据保存路径为/data/db。建议启动mongod时经过--config参数指定配置文件,更多参考官网Configuration File Options。
因此,若是咱们配置了/usr/local/etc/mongod.conf并但愿mongdb使用咱们的配置,可选的命令有2种:(1)$ mongod --config /usr/local/etc/mongod.conf和(2)$ mongod --config /usr/local/etc/mongod.conf --fork.使用命令1启动的mongod服务在前台运行,能够经过Ctrl+C关闭服务。命令2启动的mongod服务以守护线程的形式在后台运行
使用命令2启动服务端成功输出如下信息:
about to fork child process, waiting until server is ready for connections. forked process: 6775 child process started successfully, parent exiting
若是使用命令2启动失败输出信息以下:
about to fork child process, waiting until server is ready for connections. forked process: 6611 ERROR: child process failed, exited with error number 48
谷歌以后在stackoverflow上找到解决方案。这是由于已经有mongodb进程在运行,必须先找到该进程的pid,而后使用kill命令杀死该进程。
三、启动mongo shell:
mongodb自带Javascript Shell,能够运行Javascript程序,并能够和mongodb服务实例交互,启动mongo shell命令是:
mongo
客户端启动后会自动链接到mongodb服务端的test数据库:
MongoDB shell version: 3.2.7 connecting to: test Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user Server has startup warnings: 2016-06-13T10:25:10.288+0800 I CONTROL [initandlisten] 2016-06-13T10:25:10.288+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. Number of files is 256, should be at least 1000 >
关闭mongo shell:
mongo shell有2种关闭方式:
1.运行mongo shell的终端输入 control+c
2.从运行mongo shell的终端输入> exit
至此,mongodb已经彻底安装完毕!
一、新建一个文件夹,打开该文件夹,在终端输入如下命令初始化项目:
npm init
二、安装express生成器,经过应用生成器工具 express-generator 能够快速建立一个应用的骨架。express-generator 包含了 express 命令行工具。经过以下命令便可安装:
npm install express-generator -g
三、以下命令建立了一个名称为 myapp 的 Express 应用。此应用将在当前目录下的 myapp 目录中建立,而且设置为使用 Pug 模板引擎:
express --view=pug myapp
四、而后安装全部依赖包:
cd myapp npm install
五、安装nodemon。nodemon将监视启动目录中的文件,若是有任何文件更改,nodemon将自动从新启动node应用程序。
全局安装:
npm install -g nodemon
本地安装:
npm install --save-dev nodemon
六、启动项目
nodemon
出现以下:
~/code/lp-node-test/myapp » nodemon [nodemon] 1.19.1 [nodemon] to restart at any time, enter `rs` [nodemon] watching: *.* [nodemon] starting `node ./bin/www`
在浏览器输入:http://localhost:3000,express项目初步创建成功。
七、安装插件babel-register、babel-preset-env,以便在项目中使用es6语法
npm install --save babel-register babel-preset-env
在根目录下新建.babelrc文件,并输入一下内容:
.babelrc
{ "presets": ["env"] }
八、安装mongoose、mongoose-auto-increment、consola,链接mongodb数据库
npm install --save mongoose mongoose-auto-increment consola
九、安装session,用于用户登陆认证
npm install --save express-session
十、在根目录下建立config.js全局配置文件,并输入以下:
config.js
const { argv } = require('yargs'); exports.MONGODB = { uri: `mongodb://127.0.0.1:${argv.dbport || '27017'}/node`, username: argv.db_username || 'DB_username', password: argv.db_password || 'DB_password', };
十一、在根目录下建立core文件夹,新建mongodb.js文件,并输入以下:
core/mongodb.js
const consola = require('consola') const CONFIG = require('../app.config.js') const mongoose = require('mongoose') const autoIncrement = require('mongoose-auto-increment') // remove DeprecationWarning mongoose.set('useFindAndModify', false) // mongoose Promise mongoose.Promise = global.Promise // mongoose exports.mongoose = mongoose // connect exports.connect = () => { // console.log('CONFIG.MONGODB.uri :', CONFIG.MONGODB.uri) // 链接数据库 mongoose.connect(CONFIG.MONGODB.uri, { useCreateIndex: true, useNewUrlParser: true, promiseLibrary: global.Promise }) // 链接错误 mongoose.connection.on('error', error => { consola.warn('数据库链接失败!', error) }) // 链接成功 mongoose.connection.once('open', () => { consola.ready('数据库链接成功!') }) // 自增 ID 初始化 autoIncrement.initialize(mongoose.connection) // 返回实例 return mongoose }
十二、在根目录下建立util文件夹,新建util.js文件,用于放置公共方法,并输入以下:
util/util.js
import crypto from 'crypto'; module.exports = { md5: function(pwd) { let md5 = crypto.createHash('md5'); return md5.update(pwd).digest('hex'); }, // 响应客户端 responseClient(res, httpCode = 500, status = 3, message = '服务端异常', data = {}) { let responseData = {}; responseData.status = status; responseData.message = message; responseData.data = data; res.status(httpCode).json(responseData); }, // 时间 格式化成 2018-12-12 12:12:00 timestampToTime(timestamp) { const date = new Date(timestamp); const Y = date.getFullYear() + '-'; const M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; const D = date.getDate() < 10 ? '0' + date.getDate() + ' ' : date.getDate() + ' '; const h = date.getHours() < 10 ? '0' + date.getHours() + ':' : date.getHours() + ':'; const m = date.getMinutes() < 10 ? '0' + date.getMinutes() + ':' : date.getMinutes() + ':'; const s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds(); return Y + M + D + h + m + s; }, };
1三、在根目录下建立models文件夹,新建建user.js,用于构建数据库的数据模型,并输入以下:
models/user.js
const crypto = require('crypto'); const { argv } = require('yargs'); const { mongoose } = require('../core/mongodb.js'); const autoIncrement = require('mongoose-auto-increment'); const adminSchema = new mongoose.Schema({ // 名字 name: { type: String, required: true, default: '' }, //用户类型 0:管理者,1:其余用户 type: { type: Number, required: true, default: 1 }, // 手机 phone: { type: Number, required: true, default: '' }, // 邮箱 email: { type: String, required: true, default: '' }, // 密码 password: { type: String, required: true, default: crypto .createHash('md5') .update(argv.auth_default_password || 'root') .digest('hex'), }, // 建立日期 create_time: { type: Date, default: Date.now }, // 最后修改日期 update_time: { type: Date, default: Date.now }, }); module.exports = mongoose.model('User', adminSchema);
1四、把app.js修改为以下:
app.js
// modules const createError = require('http-errors'); const express = require('express'); const path = require('path'); const cookieParser = require('cookie-parser'); const logger = require('morgan'); const session = require('express-session'); // import 等语法要用到 babel 支持 require('babel-register'); const app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(express.static(path.join(__dirname, 'public'))); app.use(cookieParser('blog_node_cookie')); app.use( session({ secret: 'blog_node_cookie', name: 'session_id', //# 在浏览器中生成cookie的名称key,默认是connect.sid resave: true, saveUninitialized: true, cookie: { maxAge: 60 * 1000 * 30, httpOnly: true }, //过时时间 }), ); const mongodb = require('./core/mongodb'); // data server mongodb.connect(); //将路由文件引入 const route = require('./routes/index'); //初始化全部路由 route(app); // 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 development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); module.exports = app;
1五、把routes/index.js修改以下:
routes/index.js
/* *全部的路由接口 */ const users = require('./users'); module.exports = app => { app.post('/login', users.login); app.post('/logout', users.logout); app.post('/register', users.register); app.post('/userInfo', users.userInfo); app.get('/currentUser', users.currentUser); };
1六、把routes/users.js修改以下:
routes/users.js
const User = require('../models/user'); import { responseClient, md5 } from '../util/util.js'; exports.login = (req, res) => { const { phone, password } = req.body; const reg =/^1[34578]\d{9}$/ if (!phone) { responseClient(res, 200, 400, '用户邮箱不可为空'); return; }else if(!reg.test(phone)){ responseClient(res, 200, 400, '请输入格式正确的手机号码'); return; } if (!password) { responseClient(res, 200, 400, '密码不可为空'); return; } User.findOne({ phone, password: md5(password), }) .then(userInfo => { console.log(userInfo._id) if (userInfo) { //登陆成功后设置session req.session.userInfo = userInfo; responseClient(res, 200, 200, '登陆成功', null); } else { responseClient(res, 200, 402, '用户名或者密码错误'); } }) .catch(err => { responseClient(res); }); }; //用户验证(获取用户信息) exports.userInfo = (req, res) => { if (req.session.userInfo) { responseClient(res, 200, 200, '', req.session.userInfo); } else { responseClient(res, 200, 403, '请从新登陆', req.session.userInfo); } }; exports.logout = (req, res) => { console.log(req.session) if (req.session.userInfo) { req.session.userInfo = null; // 删除session responseClient(res, 200, 200, '登出成功!!'); } else { responseClient(res, 200, 402, '您还没登陆!!!'); } }; exports.register = (req, res) => { const { name, password, phone, type,email } = req.body; const regPhone =/^1[34578]\d{9}$/ const regEmail = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/ if (!phone) { responseClient(res, 200, 400, '用户手机号码不能为空'); return; }else if(!regPhone.test(phone)){ responseClient(res, 200, 400, '请输入格式正确的手机号码'); return; } if (!name) { responseClient(res, 200, 400, '用户名不可为空'); return; } if (!email) { responseClient(res, 200, 400, '用户邮箱不可为空'); return; }else if(!regEmail.test(email)){ responseClient(res, 200, 400, '请输入格式正确的邮箱'); return; } if (!password) { responseClient(res, 200, 400, '用户密码不可为空'); return; } //验证用户是否已经在数据库中 User.findOne({ phone }) .then(data => { if (data) { responseClient(res, 200, 402, '用户手机号码已存在!'); return; } //保存到数据库 let user = new User({ name, password: md5(password), phone, type, email }); user.save().then(data => { responseClient(res, 200, 200, '注册成功', data); }); }) .catch(err => { responseClient(res); return; }); }; exports.delUser = (req, res) => { let { id } = req.body; User.deleteMany({ _id: id }) .then(result => { if (result.n === 1) { responseClient(res, 200, 0, '用户删除成功!'); } else { responseClient(res, 200, 1, '用户不存在'); } }) .catch(err => { responseClient(res); }); };
好了,如今用户注册、登陆、登出、用户信息、删除用户接口都有了,使用postman请求接口试试
注册:
登陆:
其余接口可自行补充,git地址:https://github.com/SuperMrBea...