Nodejs小型服务器

前言

使用javascript就可以给自己搭建一个服务器,还没配置node环境的可以看我的一篇文章windows如何快速的搭建node环境,该文章篇幅较长,请细心阅读

用途

  1. 展示个人主页以及其他的网页
  2. 静态资源(可以这样访问 http://localhost:3000/static/images/head.jpg
  3. 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 // 项目的配置信息


目录.PNG

具体分析

app.js

启动文件,整个项目的入口文件,核心代码

/*
 * @Author: likang xie 
 * @Date: 2018-09-04 09:50:59 
 * @Purpose: 服务器主入口
 */

let express = require('express'); // express框架
let app = express(); // express

app.use('/static', express.static('static')); // 设置静态资源目录

app.set('view engine', 'jade'); // 设置模板引擎
app.set('views', __dirname + '/views'); // 设置模板的目录

let index = require('./routes/index');
let 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文件,然后输出给用户看

/*
 * @Author: likang xie 
 * @Date: 2018-08-31 18:20:11 
 * @Purpose: 主页路由控制函数
 */

let index = (req, res) => {
  // 参数二:传递给jade文件的数据,服务端渲染的话,通常这里会有一步数据库查询/请求接口,然后传递给jade文件
  res.render('../views/index.jade', {
    title: '主页'
  });
}

module.exports = index; // 导出该函数,app.js里导入改函数
views/index.jade

views是存放所有view层的模板文件的文件夹(该项目用的是jade模板),具体的语法查看jade文档

// index.jade
extends layout.jade // 继承模板文件
block content
  p 您好,这里是#{title}

layout.jade是公共的模块,可以写类似的header、footer等公共模块

// layout.jade
doctype html
html
  head
    title= title // 动态设置title,routes传递过来的数据
    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命名只是我一个示例,获取文章集合)

查询数据库

/*
 * @Author: likang xie 
 * @Date: 2018-09-04 10:00:14 
 * @Purpose: 文章列表接口
 */

let pool = require('../db/db');

let postlist = (req, res) => {

  let query = req.query; // 获取用户参数(GET的query、GET的params、POST参数获取方式步一样,后面会讲)
  let sql = ''; // sql查询语句

  // 建立连接池
  pool.getConnection((err, conn) => {
    // 执行查询语句
    conn.query(sql, (err, results) => {
      res.json({
        code: 200,
        message: '请求成功',
        postlist: results
      });

      // 释放连接池
      conn.release();
    })
  })

}

module.exports = postlist;

无数据库

/*
 * @Author: likang xie 
 * @Date: 2018-09-04 10:00:14 
 * @Purpose: 文章列表接口
 */

let postlist = (req, res) => {
  res.json({
    code: 200,
    message: '请求成功',
    data: []
  })
}

module.exports = postlist;
db/db.js

db是存放有关数据库的文件,主文件db.js,配置文件setting.json

/*
 * @Author: likang xie 
 * @Date: 2018-09-04 10:08:48 
 * @Purpose: 数据库连接主文件 
 */

var mysql = require('mysql'); // 引入mysql依赖
var setting = require('./setting.json'); // 引入配置文件

var pool = mysql.createPool(setting); // 创建连接池

module.exports = pool; // 导出pool,在需要连接的地方导入该方法

setting.json

{
  "host": "localhost",
  "user": "xielikang",
  "password": "123456",
  "database": "post",
  "port": 3306
}
package.json

目前用到的依赖暂时只有

{
  "devDependencies": {
    "express": "^4.16.3",
    "jade": "^1.11.0",
    "mysql": "^2.16.0"
  }
}

项目运行

请先下载此项目的模板

推荐全局安装nodemon插件,当修改代码的时候ctrl+s便自动重新编译执行,不用手动重启

  1. 全局安装nodemon插件,还没配置淘宝镜像的建议先配置淘宝镜像 http://npm.taobao.org/
cnpm install nodemon -g
  1. 在此目录打开命令行
nodemon app.js

4 浏览器打开http://localhost:3000/访问主页

  1. 浏览器输入http://localhost:3000/api/postlist来查看返回的json数据

  2. 浏览器输入http://localhost:3000/static/images/head.jpg来查看自己的静态文件(当然你得有这个文件,图片,样式,脚本)

扩展
  1. 扩展其他页面(如about页面)
// app.js
var about = require('./routes/about');
app.get('/about', about);
  1. 扩展api接口
// app.js
var userinfo= require('./apis/userinfo');

app.get('/api/userinfo', userinfo); // get query方式

app.get('/api/userinfo/:uid', userinfo);// get params方式
  1. 各种情况下参数的获取

get query参数获取(url?uid=2)

let query = req.query.uid;

get params参数获取(url/2)

let params = req.params.uid;

post参数获取

// app.js
var bodyparser = require('body-parser'); // 先引入该中间件
// 然后使用它,具体参数请自行百度
app.use(bodyparser.urlencoded({
  extended: false
}));
let body = req.body;
将此项目运行在云主机,让大家访问
  1. 购买云主机,配置好(腾讯云,阿里云等)
  2. 复制项目到云主机(配置node环境),然后运行
  3. 通过ip地址访问项目(http://119.29.73.229)
  4. 如果你的主机绑定了域名(http://www.xxx.com)
  5. 如果你有https证书(https://www.xxx.com)
  6. 如果你不把端口改为80,而是其他(http://www.xxx.com:3000),这样会很难看
  7. 当然,建议把监听的端口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);
});

最后

本文到此结束,希望以上内容对你有些许帮助,如若喜欢请记得点个关注哦 💨

image

微信公众号「前端宇宙情报局」,将不定时更新最新、实用的前端技巧/技术性文章,欢迎关注,一起学习 🌘

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 5,279评论 4 31
  • 你若盛开,爱情它爱来不来 文/小小狮子座 一: 发小菲菲打来电话,一开口就...
    小小狮子座阅读 502评论 0 2
  • 2018年2月13日的早上,那天的温度大概在16度左右,甜甜穿了一个超级厚的黄色面包服,还有围巾等等装备,看上去...
    林周五阅读 205评论 3 1
  • 你是我的往昔, 我是你的将来。 生死咫尺, 如此残忍的存在。 植物的倔强是柔软, 破壁而出, 是红的心,绿的命。 ...
    叶子飘飘吧阅读 1,502评论 11 10