先简介一下nodejs和NPM。Nodejs是2009年末Ryan Dahl在柏林的JavaScript大会上宣布的一项新技术,这项技术是关于在服务器端运行JavaScript的(是对JavaScript在浏览器端运行的方式的一种颠覆)。Nodejs是一个基于Chrome V8引擎的JavaScript运行环境,而NPM则是用Nodejs开发的JavaScript包管理工具(作为Nodejs的一个扩展模块)。

 有了Nodejs,无需再将书写好的代码部署到独立安装的Web服务器中去运行(Nodejs此时轻蔑地看了一眼NetBeans)。

1 安装

1.1 下载和安装

  • https://nodejs.org下载Windows版的msi安装包。有两种版本的(LTS和Current),LTS可以满足大多数用户需求的,Current版本则包含了更多的新特征;
  • 安装过程相当简单,打开安装包一路next就行了,唯一需要注意的是要记住安装的目录,之后设置模块全局目录需要用到(如果以后使用时发现安装中遗漏了哪些功能也可以再次打开安装包进行修复,nodejs的设计理念是之一就是只维护少量的依赖,因此其编译和安装变得非常简单);
  • 安装之后打开cmd输入node -vnpm -v验证安装结果,如果安装成功都会出现相应的版本号(现在安装nodejs就顺带安装了npm这个模块了);
  • 安装结束后,在系统的环境变量PATH中自动被添加了Nodejs的安装路径,亲测后发现,如果这个路径丢了或被改了,在终端输入node或npm,cmd就会像看傻子一样告诉你这俩东西”“不是内部或外部命令,也不是可运行的程序或批处理文件”。

1.2 什么是REPL?如何使用?

 REPL(Read Eval Print Loop),交互式解译器,表示一个电脑的环境,类似于Windows终端(cmd)或者Unix/Linux shell,Nodejs 的交互式解释器可以很好的调试 Javascript 代码;

只要在终端中输入node并回车即可启动;

交互式解释器,可以执行以下任务:

  • 读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中。
  • 执行 - 执行输入的数据结构
  • 打印 - 输出结果
  • 循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。

下面是两个常用的REPL命令:

  • Ctrl + C + CCtrl + D - 退出REPL(以前不知道每次都要重启cmd)
  • .help - 列出使用命令

1.3 npm对单一模块的安装和删除功能

参考自:https://blog.csdn.net/yihanzhi/article/details/75665959

针对安装单个模块的情况,包含安装、删除、保存为package.json三个内容。

  1. npm安装模块

    • $ npm install xxx利用 npm 安装xxx模块到当前命令行所在目录
    • $ npm install -g xxx利用npm安装全局模块xxx;
  2. 本地安装时将模块写入package.json中
    • $ npm install xxx安装但不写入package.json;
    • $ npm install xxx –save安装并写入package.json的”dependencies”中;
    • $ npm install xxx –save-dev安装并写入package.json的”devDependencies”中;
  3. npm 删除模块
    • $ npm uninstall xxx删除xxx模块;
    • $ npm uninstall -g xxx删除全局模块xxx;

1.4 通过package.json自定义模块(安装模块)

 自我感觉,nodejs开发就是模块的开发,创建一个文件夹作为模块,然后用package.json定义该模块的名称(name)、版本(version)、依赖(dependencies)、开发者依赖(devDependencies)等字段,我们在该模块内进行开发、测试等功能,也可以把这个模块发布出去。

 package.json是一个用于自定义模块的文件,(严格采用json格式)来定义自建的模块,其主要针对单个文件夹,使用npm安装时,会根据dependencies字段中的依赖项来重置该文件夹下的node_modules子文件夹,若不存在node_modules则会新建(也就是说,如果原来node_modules中有东西,也会被清空并替换成dependencies中的模块)。package.json的简单格式如下所示:(其中,只有name字段和version字段是必不可少的,dependencies字段中列出了自建模块需要的依赖项,依赖模块后面是版本号)

{
"name": "my-colors-project",
"version": "0.0.1",
"dependencies": {
"colors": "0.5.0"
}
}

安装模块的流程如下:

  1. 新建文件夹,并定位到该文件夹

    $ mkdir my-project

    $ cd my-project
  2. 在文件夹下新建package.json文件,按照json格式输入nameversion两个字段(在dependencies字段中定义要使用的依赖模块及其版本号
  3. 使用npm安装(先定位到当前文件夹下)

    $ npm install
  4. 若需要添加模块到package.json文件中,可以在定位到文件夹目录后,使用下面两条命令来执行(package.json文件一定要存在):

    $ npm install xxx –save安装并写入package.json的“dependencies”中;

    $ npm install xxx –save-dev安装并写入package.json的“devDependencies”中;

注意事项:

  • 若所在文件夹下没有package.json文件,使用$ npm install xxx -save功能后,会产生致命后果:nodejs安装目录下的node_modules文件夹被重置,安装xxx模块相依赖的模块;
  • 定位到global目录后,使用$ npm install xxx -save命令时,即便global目录下包含package.json文件,也不会记录dependencies字段

1.5 设置全局目录

 全局目录包含两部分:cache(缓存)和global(模块包),默认安放在C盘的User\Administrator下,可以通过命令$ npm config get cache$ npm config get prefix查看当前cache目录和global目录。

 为了方便管理,我们在nodejs的安装目录下新建两个文件夹:node_cachenode_global,然后在终端使用$ npm config set cache ""$ npm config set global ""命令设置全局目录(”“中为node_cachenode_global的绝对路径名)。

 设置完成后,安装和删除单个模块时在后方加上-g就可以对该目录下的模块操作了。

2 部署网站

2.1 安装express模块

2.2 使用js文件部署服务器

首先创建一个js文件,在里面输入代码段:

var express = require("express");

//部署服务器
var app = express();
app.use(express.static("G:\MyWebs")).listen(3333);

代码的意思是使用express提供的方法来部署服务器。

static()函数里面的字符串是网站的路径名,好像相对路径的办法行不通;listen()函数里面是端口号。

2.3 访问

 然后就可以通过REPL打开js文件来部署服务器啦,部署在本地服务器上,域名为localhost或者127.0.0.1,在后面加上端口号就可以访问啦。

https://localhost:3333/
https://127.0.0.1:3333/

3 获取本地IP地址

参考资料:

nodejs官方API的os.networkInterfaces()

iteye用户zhangyaochun的博客

 在局域网内供他人访问,首先要获取自己的IP地址,除了传统的ipconfig命令手动获取添加外,我们有必要考虑如何让nodejs自动获取主机的IP地址。

 这里借用nodejs自带的os模块里面的os.networkInterfaces()方法来获取本地连接接口,os就是operation system操作系统模块。

3.1 编写获取IPv4的函数

 编写函数getLocalIPv4()函数,返回当前主机在网络连接中的IPv4地址:

//获取IPv4地址
function getLocalIPv4(){
interfaces = require("os").networkInterfaces(); for(var devName in interfaces){//遍历所有连接
var iface = interfaces[devName];
for(var i=0; i<iface.length; i++){//遍历每个连接中的不同地址(family为标识)
var alias = iface[i];
if(alias.family == 'IPv4'&&alias.address != '127.0.0.1'&&!alias.internal)//该判断保证为有效的IPv4地址(排除了内部地址和本地地址)
{
return alias.address;
}
}
} }
var ipv4 = getLocalIPv4();

3.2 函数思路解析

函数的思路如下:

  1. 首先我们用os.networkInterfaces()获取对象,这个对象具体是啥我也不知道(直接输出devName的话是“无线网络连接”、“Loopback Pseudo-Interface 1”这种鬼东西,好像后者即使没有联网也可以获取,类似于主机对外接口之类的东西吧),所以用devName对其进行遍历,然后通过devName作为索引来反向访问获取到的东西(聪明);
  2. 通过连接名获取连接后,类似于ipconfig得到的连接样式,一个连接下面有IPv4、IPv6等各种各样的连接,这时候就要遍历这些IPv4、IPv6……通过family这个关键字来判断,然后排除掉内部连接和本地连接后,能进入if条件句的就是货真价实的IPv4了。

3.3 官方API对networkInterfaces()的解释

最后我们明确一下os.networkInterfaces()获取到的究竟是个什么东西(前方大量抄袭!),官方API告诉我们,获取到的是一个对象(Object),其数据结构如下:

{
lo: [
{
address: '127.0.0.1',
netmask: '255.0.0.0',
family: 'IPv4',
mac: '00:00:00:00:00:00',
internal: true,
cidr: '127.0.0.1/8'
},
{
address: '::1',
netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
family: 'IPv6',
mac: '00:00:00:00:00:00',
internal: true,
cidr: '::1/128'
}
],
eth0: [
{
address: '192.168.1.108',
netmask: '255.255.255.0',
family: 'IPv4',
mac: '01:02:03:0a:0b:0c',
internal: false,
cidr: '192.168.1.108/24'
},
{
address: 'fe80::a00:27ff:fe4e:66a1',
netmask: 'ffff:ffff:ffff:ffff::',
family: 'IPv6',
mac: '01:02:03:0a:0b:0c',
internal: false,
cidr: 'fe80::a00:27ff:fe4e:66a1/64'
}
]
}

lo是内部地址,eth0是外部地址。

  • address <string> The assigned IPv4 or IPv6 address
  • netmask <string> The IPv4 or IPv6 network mask
  • family <string> Either IPv4 or IPv6
  • mac <string> The MAC address of the network interface
  • internal <boolean> true if the network interface is a loopback or similar interface that is not remotely accessible; otherwise false
  • scopeid <number> The numeric IPv6 scope ID (only specified when family is IPv6)
  • cidr <string> The assigned IPv4 or IPv6 address with the routing prefix in CIDR notation. If the netmask is invalid, this property is set to null

Nodejs学习笔记(1) Nodejs安装+借助express模块简单部署服务器的更多相关文章

  1. nodejs学习笔记一:安装express框架并构建工程目录

    偶遇node是在一个阳光明媚的上午,无意间打开博客看到一片关于nodejs的介绍,通读全篇后,心情跌宕起伏,哎呀,这么好的东西我竟然现在才知道,这是最气的,于是马上开始制定学习nodejs计划,好了, ...

  2. nodejs学习笔记一——nodejs安装

    a.nodejs安装 nodejs的安装没有什么说的默认安装即可.安装包官网下载即可:nodejs官网 本人用的是window的安装包node-v4.2.6-x64.msi 安装完成后打开命令行查看使 ...

  3. nodejs学习笔记三——nodejs使用富文本插件ueditor

    在做自己的nodejs项目的时候遇到需要使用ueditor.原来下载的是ueditor的jsp版本.目录如下  在ueditor.config.js中有配置服务器home路径(这个home路径能找到u ...

  4. nodejs(7)练习 http 和 express 创建简单的服务器

    http const http = require('http') // 创建服务器 const server = http.createServer() // 绑定事件,监听客户端的请求 serve ...

  5. Nodejs学习笔记(六)--- Node.js + Express 构建网站预备知识

    目录 前言 新建express项目并自定义路由规则 如何提取页面中的公共部分? 如何提交表单并接收参数? GET 方式 POST 方式 如何字符串加密? 如何使用session? 如何使用cookie ...

  6. Nodejs学习笔记(六)—Node.js + Express 构建网站预备知识

    前言 前面经过五篇Node.js的学习,基本可以开始动手构建一个网站应用了,先用这一篇了解一些构建网站的知识! 主要是些基础的东西... 如何去创建路由规则.如何去提交表单并接收表单项的值.如何去给密 ...

  7. Nodejs学习笔记(三)——一张图看懂Nodejs建站

    前言:一条线,竖着放,如果做不到精进至深,那就旋转90°,至少也图个幅度宽广. 通俗解释上面的胡言乱语:还没学会爬,就学起走了?! 继上篇<Nodejs学习笔记(二)——Eclipse中运行调试 ...

  8. Nodejs学习笔记(二)——Eclipse中运行调试Nodejs

    前篇<Nodejs学习笔记(一)——初识Nodejs>主要介绍了在搭建node环境过程中遇到的小问题以及搭建Eclipse开发Node环境的前提步骤.本篇主要介绍如何在Eclipse中运行 ...

  9. Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...

随机推荐

  1. codeforces 1045I Palindrome Pairs 【stl+构造】

    题目:戳这里 题意:给1e5个字符串,问有多少对字符串组合,满足最多只有一种字符有奇数个. 解题思路:每种情况用map存一下就行了.感觉这题自己的代码思路比较清晰,所以写个题解记录一下 附ac代码: ...

  2. codeforces 869A

    A. The Artful Expedient time limit per test 1 second memory limit per test 256 megabytes input stand ...

  3. HDU 6704 K-th occurrence(主席树 + RMQ + 后缀数组)题解

    题意: 给一个串\(S\),\(length\leq 1e5\),\(Q\leq1e5\)个询问,每次询问输出和\(S_lS_{l+1}\dots S_r\)长得一模一样的第\(k\)个子串的开头位置 ...

  4. Windows font-size: 10px; bug

    Windows font-size: 10px; bug Windows 最小只能渲染 font-size: 12px; ???屏幕分辨率 macOS 正常渲染 10px PC 最小只能渲染 font ...

  5. iPhone 12 导入通讯录排序 Bug

    iPhone 12 导入通讯录排序 Bug iOS iOS 通讯录排序问题 Huawei OK solution iOS 切换中英文,修复排序通讯录 bug Awesome iOS Contacts ...

  6. flex & flex-wrap

    flex & flex-wrap https://css-tricks.com/almanac/properties/f/flex-wrap/ https://developer.mozill ...

  7. django学习-3.如何编写一个html页面并展示到浏览器,及相关导入错误的解决方案

    1.前言 在django中,视图的概念是:具有相同功能和模板的网页,都可以称为视图.通俗一点来说,就是你平常打开任一浏览器,输入一个地址A后看到浏览器窗口展示出来地址A所对应的页面内容B,页面内容B就 ...

  8. 系统错误,MSVCP100D.dll找不到或丢失!

    文章首发 | 公众号:lunvey 今日研究c++,找了一些示例程序,发现无法打开.弹出如下的报错提示: 作为新时代人类,遇见问题第一件事情就是问度娘.然而眼花缭乱的检索数据,大家众说纷纭,不知道如何 ...

  9. Java ThreadPoolExecutor详解

    ThreadPoolExecutor是Java语言对于线程池的实现.池化技术是一种复用资源,减少开销的技术.线程是操作系统的资源,线程的创建与调度由操作系统负责,线程的创建与调度都要耗费大量的资源,其 ...

  10. JAVA 判断一个字符串是否是合法的日期格式?

    采用SimpleDateFormat类的parse方法进行判断,如果转换不成功,就会出现异常.另外,还需要判断字符串的长度,若不判断,第二个字符串就会验证通过,实际上也不是合法的.话不多说,且看代码: ...