为了账号安全,请及时绑定邮箱和手机立即绑定

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
启动文件,整个项目的入口文件,核心代码

// 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便自动重新编译执行,不用手动重启

  1. 全局安装nodemon插件,还没配置淘宝镜像的把cnpm改为npm,或者配置淘宝镜像 http://npm.taobao.org/
cnpm install nodemon -g
  1. 在此项目目录下安装依赖
cnpm install
  1. 在此目录打开命令行
nodemon app.js

run.PNG

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

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

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

扩展
  1. 整体架构基本如下,再按照自己的喜好进行调整
  2. 扩展其他页面(如about页面)
// app.js
var about = require('./routes/about');
app.get('/about', about);
  1. 扩展api接口
// app.js
var userinfo= require('./apis/userinfo');
// 当然如果你想用户post过来,那就把get改为post
app.get('/api/userinfo', userinfo);
// 或许你用的是RESTfull接口规范
app.get('/api/userinfo/:uid', userinfo);
  1. 各种情况下参数的获取(请看上面的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;
将此项目运行在云主机,让大家访问
  1. 购买云主机,配置好(腾讯云,阿里云等)
  2. 复制项目到云主机(配置node环境),然后运行
  3. 通过ip地址访问项目(http://119.29.73.229)
  4. 如果你的主机绑定了域名(http://www.xielikang.com)
  5. 如果你有https证书(https://www.xielikang.com)
  6. 如果你不把端口改为80,而是其他(http://www.xielikang.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);
});
点击查看更多内容
12人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Web前端工程师
手记
粉丝
1.4万
获赞与收藏
1319

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消