Node.js 插件 —— express 一个简洁灵巧的node.js Web 应用框架
全局安装依赖包
npm i express -g
npm i express-generator -g
express v4 之后,就需要手动安装一下Generator
检测express是否安装成功:express --version
, 如果出现版本号,则安装完成。
express 创建工程
- 打开终端,选择路径到您想要创建的位置;
- 使用命令创建项目
express project_name
; - 下载相关依赖包
npm install
在project_name目录下执行这个命令; - 依赖包下载完成后,在project_name目录下执行
npm start
启动项目; - 在浏览器输入地址:
127.0.0.1:3000
,如果能打开,那么就大功告成了,最简单的服务器就可以使用了 - 然后这个工程就初始化完成了;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hI9BvjPQ-1572777998655)(express_files/1.jpg)]
目录解释
- bin:存放可执行文件(服务器基础配置www)
- public:存放 image、css、js 等文件
- routes:存放路由文件
- views:存放视图文件或者说模版文件
- app.js:启动文件,或者说入口文件
- package.json:存储着工程的信息及模块依赖,当在 dependencies 中添加依赖的模块时,运行 npm install,npm 会检查当前目录下的 package.json,并自动安装所有指定的模块
- node_modules:存放 package.json 中安装的模块,当你在 package.json 添加依赖的模块并安装后,存放在这个文件夹下
在bin/www 中配置自动 “运行时自动打开浏览器” 只需要添加两句代码
var cp = require("child-process"); // 引入 child-process 模块
cp.exec("start http://127.0.0.1:3000"); // 配置项目启动后,自动在默认浏览器打开该窗口
app.js 解释
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
// 导入路由依赖模块
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
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')));
/// 使用中间件形式实现跨域访问(自己添加)
app.use("*", function (req, res, next) {
//设置允许跨域的域名,*代表允许任意域名跨域
res.header("Access-Control-Allow-Origin", "*");
//允许的header类型
res.header("Access-Control-Allow-Headers", "content-type");
//接收ajax请求手动提交的cookie信息
res.header("Access-Control-Allow-Credentials", true);
//跨域允许的请求方式
res.header("Access-Control-Allow-Methods", "DELETE,PUT,POST,GET,OPTIONS");
if (req.method == 'OPTIONS')
res.sendStatus(200); //让options尝试请求快速结束
else
next();
});
/// token验证, 需要用到下面的token.js
app.use(function (req, res, next) {
console.log("req.url", req.url)
if (req.url == "/users/login" || req.url == "/users/register") { //如果是登录或者注册请求,直接通过验证
next();
}
else { //表示非登录请求,需要验证token
//获取前端传来的token,开始验证,如果验证通过运行进入下一步,否则直接解决提供服务
var token = req.query.token || req.body.token;
tokenobj.verifyToken(token, function (bo) {
if (bo) {
console.log("验证成功")
next();
}
else {
console.log("token异常")
res.send({ success: false, msg: "token无效,请重新登录" });
}
});
}
});
// 根据用户输入的地址,进入不同的路由文件
// 列如地址:127.0.0.1:3000/users/login.html;
// js 就会根据127.0.0.1:3000之后的内容(/users/login.html)进行字符串匹配,找到一个匹配最完全的项(/users),进入相应的路由文件(usersRouter)
app.use('/', indexRouter);
app.use('/users', usersRouter);
// 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;
token.js token验证
var jwt = require("jsonwebtoken");
var tokenObj = {
createToken: function (cont, time) {
var content = cont //token存储的内容
var secretOrPrivateKey = 'cc.com' // 这是加密的key(密钥或私钥)
var token = jwt.sign(content, secretOrPrivateKey, {
expiresIn: time // 过期时间
})
return token;
},
verifyToken: function (token, fn) {
var secretOrPrivateKey = 'cc.com' // 这是加密的key(密钥或私钥)
jwt.verify(token, secretOrPrivateKey, function (err, decode) {
if (err) { // 当token过期,或这是一个伪造的token,或这是无效的token时会触发此逻辑
console.log(err)
fn(false);
} else {
console.log(decode);
fn(true);
}
})
}
}
module.exports=tokenObj;