文档章节

Node.js快速上手并部署到好雨云

好雨Rainbond
 好雨Rainbond
发布于 2017/01/13 14:37
字数 2023
阅读 9
收藏 0

Node.js快速上手并部署到好雨云

网站的错误不经常发生,但当我们遇到的时候非常令人懊恼,比如当我们想要在线挂号的时候,遇到了这个: 201701132957414841857413474.jpg

为什么会出现这种情况,背后的服务器发生了什么?我们将使用Node.js做一个简单的web服务器并利用好雨应用管理平台将我们本地的服务放到互联网上面。

Node.js是一个开源的跨平台运行环境,允许我们构建一个服务器端和网络应用的运行环境。使用JavaScript语言开发可以通过Node.js运行时环境跑在任何平台。当然,开始使用前我们需要先进行安装,通过这个下载地址找到适合我们系统的安装包进行安装。

简单的开始

首先我们需要写一个JavaScript文件,我们叫它server.js,这个就是我们运行web服务器的程序。

var http = require("http");

http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("It's work!");
  response.end();
}).listen(5000);

相信我,这是你看到的最简单的服务器程序了,是不是很简单,接着我们在命令行下运行这个文件。

node server.js

这样我们的web服务器就已经运行了,打开浏览器让我们确认一下它正常工作了。

201701131553414841872494604.jpg

Node.js可以用很少的资源,应付大流量访问,因为node采用了event loop机制来解决单线程的问题,这种运行方式称为"异步模式"(asynchronous I/O)或"非堵塞模式"(non-blocking mode)。

让我们通过这幅图解释的更详细一些:

201701134114414842057209799.jpg

这幅图很好的展示了在Node.js服务内部是如何工作的。一个用来处理外部事件并且把它们转换成对回调的调用的实体。

这些工作都是在服务内服实现的,我们在写代码的过程中不会接触到这些问题。所以我们只需要了解Node运行如此快的原因正是基于这种"异步I/O模式"就可以了。

部署到网上

我的服务器已经正常运行了,可是它只是跑在我的本地,如果想要让更多的人访问我的网站,我需要将它放到互联网上我们需要选择一个云平台来部署我们的网站。对于云平台我们有很多选择,比如亚马逊Heroku等等,但因为众所周知的原因,国外的云服务我们使用起来并不方便,甚至无法访问。所以我选择了好雨云来部署网站,好雨云是一个云端的应用管理平台,也就是我们通常所说的PaaS(platform as a service),它允许你自动部署web应用,支持几种构建方式,比如我使用就是源码构建,这节省了我很多时间,可以让我专心写代码,不用为服务器、网络以及代码运行环境的配置操心。

写个博客

好,在部署之前,我们需要进行一些开发的工作,让我们写个简单网站,新建项目目录名为myblog,并创建server.js(上面说过的,还记得吗?)首先声明一些变量:

var http = require("http");
var fs = require("fs");
var path = require("path");
var mime = require("mime");

这里包含了一个第三方的依赖mime,他不是node的一部分,我们需要先安装这些第三方依赖才能让程序工作。为了解决依赖问题我们需要写一个package.json文件将我们项目需要的依赖放进去。

就像这样:

{
  "name" : "myblog",
  "version" : "0.0.1",
  "description" : "a simple blog",
  "dependencies" : {
    "mime" : "~1.2.7"
  },
  "scripts": {
    "start": "node server.js"
  },
  "engines": {
    "node": "4.7.2"
  }
}

语法很简单,但要注意一些语法细节,不然经常会发生因为少了逗号或者引号造成构建失败这种低级的错误。这里我们声明依赖的mime的版本、启动命令以及node的版本。

如果我们代码的根目录下存在package.json文件那么好雨云就会判断这是Node.js程序并安装相应的依赖以及调用我们声明的命令来启动程序。

接着我们需要为web服务器增加一些功能来处理不同的请求,send404是当请求到不存在的文件时,我们要如何处理:

function send404(response) {
  response.writeHead(404, {"Content-type" : "text/plain"});
  response.write("Error 404: resource not found");
  response.end();
}

sendFile文件数据服务:

function sendFile(response, filePath, fileContents) {
  response.writeHead(200, {"Content-type" : mime.lookup(path.basename(filePath))});
  response.end(fileContents);
}

定义服务器如何执行请求:

function serverWorking(response, absPath) {
  fs.exists(absPath, function(exists) {
    if (exists) {
      fs.readFile(absPath, function(err, data) {
        if (err) {
          send404(response)
        } else {
          sendFile(response, absPath, data);
        }
      });
    } else {
      send404(response);
    }
  });
}

创建http服务器:

var server = http.createServer(function(request, response) {
  var filePath = false;

  if (request.url == '/') {
    filePath = "public/index.html";
  } else {
    filePath = "public" + request.url;
  }

  var absPath = "./" + filePath;
  serverWorking(response, absPath);
});

配置服务的监控端口:

var port_number = server.listen(process.env.PORT || 5000);

为啥是5000呢?因为好雨云默认分配5000的监控端口。所以我们将这里配置好,就可以直接被访问到。

然后我们开始写内容,在项目目录(myblog)下新建几个目录:publicstylesheetsimages。我们将index.html放到public下,将我们样式文件 style.css放到stylesheets下,静态资源图片放到images下。

博客的首页index.html代码如下:

<!DOCTYPE html>
<html>
    <head>
        <title>我的博客</title>
        <link rel="stylesheet" type="text/css" href="http://oe5ahutux.bkt.clouddn.com/style.css">
    </head>
    <body>
        <div id="header">
            <span>一个简单的博客</span>
        </div>
        <div id="content">
            <h2><a href="http://www.amazon.cn/gp/product/B007VISQ1Y/ref=as_li_ss_tl?ie=UTF8&camp=536&creative=3132&creativeASIN=B007VISQ1Y&linkCode=as2&tag=jysperm07-23">JavaScript 权威指南</a></h2>
            <p>这本书事无巨细地介绍了 JasvaScript 语言核心、标准库以及浏览器提供的 DOM 和 BOM. 本书并没有由浅入深的结构,而是通篇平铺直叙地介绍,因此适合有一定 JavaScript 基础的人从头至尾阅读来掌握一些相对细节的 JavaScript 知识,或遇到具体问题时查阅相关章节。</p>
            
            <h2><a href="something.html">JavaScript 异步编程</a></h2>
            <p>这本书介绍了 JavaScript 中事件模型、Promise、async.js 等异步抽象的设计和实现,同时也介绍了 Web Woerk 等在浏览器中优化性能的技巧。这本书适合所有 JavaScript 程序员增加对 Promise 等异步模型的理解,并在实践中挑选合适的异步模型。</p>
        </div>
    </body>
</html>

浏览器中访问的样子: 201701137014314841919993236.jpg

首页代码中,我故意写了一个可以访问的正确链接和一个不可访问的错误链接,这样我可以试一下404返回内容。

201701139802914842048899546.jpg

###部署到好雨云

OK,到这里我们的网站写好了,需要将代码提交到好雨云来部署,点新建应用后,好雨平台会给我们一个git代码仓库的地址,我们只需要将代码提交到这个地址就可以了。

201701139199714841924411600.jpg

在我们本地的myblog项目目录中执行

# 初始化本地git仓库
git init
# 添加远程仓库地址
git remote add goodrain http://code.goodrain.com/app/simtime_gr8904c4.git
# 执行提交
git add .
git commit -m "first commit"
git push -u goodrain master

提交后,平台自动识别了我们的语言

201701132669114841927681472.jpg

在自动构建和部署之后,我们就可以访问到我们的网站了。

201701135648614842052264688.jpg

总结

我们写了不到60行代码,将我们的web服务器构建了起来,并写了一个演示用的博客页面,也许你会说这太简单了,没错,确实是这样,但通过这些你可以快速的了解到web服务器是如何工作。你还可以将Node.js与更多技术结合,比如HTML5CSS3以及JavaScript,当然还包括种类丰富的库和框架支持。

PaaS云平台的选择也是一个重点,可以帮助我们快速学习、试验我们的代码,将我们从复杂的配置和运维工作中解脱了出来。

参考资料: http://abdelraoof.com/blog/2015/10/28/understanding-nodejs-event-loop/ http://doc.goodrain.com/usage/181950

© 著作权归作者所有

好雨Rainbond
粉丝 1
博文 56
码字总数 68503
作品 0
朝阳
私信 提问
【听云Node.js探针公测】注册/部署,都有礼!

千呼万唤始出来 听云Server for Node.js探针公测上线,诚邀关注应用性能的您! 听云Server能监控神马? · 应用代码的响应时间,通过慢追踪,定位有问题的代码。 · 关系型数据库的查询操作 ...

听云APM
2015/06/03
6.4K
25
基于 vue + Node.js 的内容管理系统 DoraCMS

DoraCMS 使用的技术栈: 1、vue + vuex + vue-router 全家桶 2、webpack 2 3、nodejs 8.0 + express 4 4、mongodb 3+ 演示地址: 前端开发俱乐部 后台登录: https://www.html-js.cn/dr-admi...

蒋轩
09/11
81
0
关于开发node.js个人网站,你需要的知识都在这里了

前言 nodejs.jpg 从2016年5月份开始,接触Node.js到现在已经有一年半的时间了。从最初的懵懵懂懂,到一篇一篇地啃大部头、看教程,再到自己开始写笔记、写教程,以及上手做了一些小功能,最终...

Mike的读书季
2017/12/01
0
0
如何通过织云 Lite 愉快地玩转 TSW

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 织云 Lite & TSW 织云 Lite 是一款轻量型服务管理平台,提供标准化的应用打包操作,可连接持续集成系统,完成线上程序分发,轻松...

腾讯云+社区
2018/05/22
0
0
如何通过织云Lite愉快地玩转TSW

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 织云 Lite & TSW 织云 Lite 是一款轻量型服务管理平台,提供标准化的应用打包操作,可连接持续集成系统,完成线上程序分发,轻松...

腾讯云加社区
2018/05/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
9
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
12
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
5
0
Django的ChoiceField和MultipleChoiceField错误提示,选择一个有效的选项

在表单验证时提示错误:选择一个有效的选项 例如有这样一个表单: class ProductForm(Form): category = fields.MultipleChoiceField( widget=widgets.SelectMultiple(), ...

编程老陆
昨天
10
0
Vue核心概念及特性 (一)

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。 > 特点: 易用,灵活,高效,渐进式框架。 > 可以随意组合需要用到的模块 vue + components + vue-router + vuex + v...

前端优选
昨天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部