前言
使用javascript就可以给自己搭建一个服务器,还没配置node环境的可以看我的一篇文章windows如何快速的搭建node环境,该文章篇幅较长,请细心阅读
用途
- 展示个人主页以及其他的网页
- 静态资源(可以这样访问 http://localhost:3000/static/images/head.jpg)
- API接口 (给前端ajax调用,并返回json数据)
大神勿喷
本教程只是用nodejs写一个小型服务器,自己觉得这样够用,大神绕过
项目结构
####myserver
node_modules // 依赖文件
db // 数据库相关
- db,js
- setting.json
static // 静态资源目录
- images
- javascripts
- stylesheets
- others
views // view层的html文件或者其他模板引擎(.jade、.ejs)
- index.jade
- layout.jade
routes // 路由控制
- index.js
- about.js
apis // api接口
- postlist.js
app.js // 启动文件
package.json // 项目的配置信息
具体分析
#####app.js
启动文件,整个项目的入口文件,核心代码
// app.js
var express = require('express'); // express框架
var app = express(); // express
app.use('/static', express.static('static')); // 设置静态资源目录
app.set('view engine', 'jade'); // 设置模板引擎
app.set('views', __dirname + '/views'); // 设置模板的目录
var index = require('./routes/index');
var postlist = require('./apis/postlist');
// 当用户访问/的时候,执行index函数,该函数输出index.jade内容
app.get('/', index);
// 当用户get该地址的时候,执行postlist函数,该函数查询数据库的数据,并以json的形式返回给用户
app.get('/api/postlist', postlist);
app.listen(3000); // 监听3000端口
#####routes/index.js
routes是存放所有路由的文件夹,每个文件对应返回views文件夹对应的jade文件,然后输出给用户看,所以以后添加的about.js就相应地render(’…/views/about.jade’)
// index.js
const index = (req, res) => {
// 参数2则是传递给jade文件的数据
res.render('../views/index.jade', {
title: '一英尺卷烟'
});
}
module.exports = index; // 导出该函数,app.js里导入改函数
#####views/index.jade
views是存放所有view层的模板文件的文件夹(该项目用的是jade模板),具体的语法查看jade文档
// index.jade
extends layout.jade // 继承layout.jade
block content
p 欢迎来到#{title}的个人网站
layout.jade是公共的模块,可以写类似的header、footer等公共模块
// layout.jade
doctype html
html
head
title= title // 动态设置title
meta(charset="UTF-8")
meta(name="viewport", content="width=device-width, initial-scale=1.0, user-scalable=no")
meta(http-equiv="X-UA-Compatible", content="ie=edge")
meta(name="renderer", content="webkit")
body
block content // content 是该模块的名字
#####apis/postlist.js
apis是存放所有的api函数的文件夹,函数具体内容是读取数据库,返回json数据(postlist命名只是我一个示例,获取文章集合函数)
// postlist.js
// 没有数据库的可以暂时把所有有关数据库的代码注释掉,可以返回静态的数据来看看效果
var pool = require('../db/db'); // 导入db.js
const postlist = (req, res) => {
const query = req.query; // 获取用户参数(get、post、RESTfull获取方式都不一样)
const sql = ''; // sql查询语句
// 建立连接池
pool.getConnection((err, conn) => {
// 执行查询语句
conn.query(sql, (err, results) => {
// 成功后把查询到的结果以json的格式返回给用户
res.json({
code: 200,
message: '请求成功',
postlist: results // 或则静态数据,来看看效果
});
// 释放连接池
conn.release();
})
})
}
module.exports = postlist; // 导出该方法,app.js导入该方法
#####db/db.js
db是存放有关数据库的文件,主文件db.js,配置文件setting.json
// db.js
var mysql = require('mysql'); // 引入mysql依赖
var setting = require('./setting.json'); // 引入配置文件
// 创建连接池
var pool = mysql.createPool(setting);
module.exports = pool; // 导出pool,在需要连接的地方导入该方法
// setting.json
{
"host": "localhost", // 建议数据库安装到云主机,通过ip+端口进行连接
"user": "xielikang",
"password": "123456",
"database": "post",
"port": 3306
}
#####package.json
项目的配置信息还有依赖
{
"name": "myserver",
"version": "0.0.1",
"private": true,
"dependencies": {
"body-parser": "^1.18.2",
"cookie-parser": "~1.4.3",
"debug": "~2.6.9",
"express": "^4.15.5",
"jade": "^1.11.0",
"morgan": "~1.9.0",
"mysql": "^2.15.0",
"serve-favicon": "~2.4.5"
}
}
项目运行
请先下载此项目的模板
推荐全局安装nodemon插件,当修改代码的时候ctrl+s便自动重新编译执行,不用手动重启
- 全局安装nodemon插件,还没配置淘宝镜像的把cnpm改为npm,或者配置淘宝镜像 http://npm.taobao.org/
cnpm install nodemon -g
- 在此项目目录下安装依赖
cnpm install
- 在此目录打开命令行
nodemon app.js
4 浏览器打开http://localhost:3000/访问主页
-
浏览器输入http://localhost:3000/api/postlist来查看返回的json数据
-
浏览器输入http://localhost:3000/static/images/head.jpg来查看自己的静态文件(当然你得有这个文件,图片,样式,脚本)
扩展
- 整体架构基本如下,再按照自己的喜好进行调整
- 扩展其他页面(如about页面)
// app.js
var about = require('./routes/about');
app.get('/about', about);
- 扩展api接口
// app.js
var userinfo= require('./apis/userinfo');
// 当然如果你想用户post过来,那就把get改为post
app.get('/api/userinfo', userinfo);
// 或许你用的是RESTfull接口规范
app.get('/api/userinfo/:uid', userinfo);
- 各种情况下参数的获取(请看上面的postlist.js)
get参数获取
let query = req.query;
post参数获取
// app.js
var bodyparser = require('body-parser'); // 先引入该中间件
// 然后使用它,具体参数请自行百度
app.use(bodyparser.urlencoded({
extended: false
}));
let body = req.bory;
RESTfull接口参数获取
let params = req.params;
将此项目运行在云主机,让大家访问
- 购买云主机,配置好(腾讯云,阿里云等)
- 复制项目到云主机(配置node环境),然后运行
- 通过ip地址访问项目(http://119.29.73.229)
- 如果你的主机绑定了域名(http://www.xielikang.com)
- 如果你有https证书(https://www.xielikang.com)
- 如果你不把端口改为80,而是其他(http://www.xielikang.com:3000),这样会很难看
- 当然,建议把监听的端口http的改为80,https的改为443
nodejs配置https证书,同时开启http和https
// app.js
// app.listen(3000); // 这一段删掉
var http = require('http'); // http模块
var https = require('https'); // https模块
var fs = require('fs'); // 文件读写模块
// 证书文件,自己去下载对应的版本
var privateKey = fs.readFileSync('./static/path/to/2_www.xielikang.com.key', 'utf8');
var certificate = fs.readFileSync('./static/path/to/1_www.xielikang.com_bundle.crt', 'utf8');
var credentials = {
key: privateKey,
cert: certificate
};
const PORT = 80; // http端口
const SSLPORT = 443; // https端口
// 创建http服务器
var httpServer = http.createServer(app);
// 创建https服务器
var httpsServer = https.createServer(credentials, app);
// 监听80端口
httpServer.listen(PORT, function () {
console.log('HTTP Server is running on: http://localhost:%s', PORT);
});
// 监听443端口
httpsServer.listen(SSLPORT, function () {
console.log('HTTPS Server is running on: https://localhost:%s', SSLPORT);
});