node.js

时间:2022-12-12 01:07:10

关于报错及解决方案

问题一:

安装nrm失败遇到audit问题
node.js
解决方案:
在安装指令后面加上 -no-fund --no-audit,这个是解决安装三方依赖关于audit问题的核心。以后只要遇到需要audit的问题,在原先的安装指令后面加上这个尾缀即可。
——参考博客

问题二:

安装nrm成功还是无法使用
node.js
解决方法:应该使用 open 的 CommonJs规范的包 ,现在 open v9.0.0 是 ES Module 版本的包。使用指令 npm i -g nrm open@8.4.2 --save
——参考博客

问题三:

安装cnpm报fund提示
node.js
解决方法:在指令后面加–no-fund
——参考博客

一、Node.js基础

1. 认识Node.js

Node.js是一个javascript运行环境。它让javascript可以开发后端程序,实现几乎其他后端语言实
现的所有功能,可以与PHP、Java、Python、.NET、Ruby等后端语言平起平坐。
Nodejs是基于V8引擎,V8是Google发布的开源JavaScript引擎,本身就是用于Chrome浏览器的
js解释部分,但是Ryan Dahl 这哥们,鬼才般的,把这个V8搬到了服务器上,用于做服务器的软
件。

  1. nodejs的特性
    Nodejs语法完全是js语法,只要你懂js基础就可以学会Nodejs后端开发
    NodeJs超强的高并发能力,实现高性能服务器
    开发周期短、开发成本低、学习成本低
  2. 浏览器环境vs node环境
    node.js

Node.js 可以解析JS代码(没有浏览器安全级别的限制)提供很多系统级别的API,如:

  • 文件的读写 (File System)
const fs = require('fs')
fs.readFile('./ajax.png', 'utf-8', (err, content) => {
	console.log(content)
})
  • 进程的管理 (Process)
function main(argv) {
	console.log(argv)
}
main(process.argv.slice(2))
  • 网络通信 (HTTP/HTTPS)
const http = require("http")
http.createServer((req,res) => {
	res.writeHead(200, {
		"content-type": "text/plain"
	})
	res.write("hello nodejs")
	res.end()
}).listen(3000)

2. 开发环境搭建

http://nodejs.cn/download/
node.js

3. 模块、包、commonJS

  1. 为什么要有模块化开发?
    node.js

  2. CommonJS规范
    node.js
    node.js

  3. modules模块化规范写法
    我们可以把公共的功能 抽离成为一个单独的 js 文件 作为一个模块,默认情况下面这个模块里面的方法
    或者属性,外面是没法访问的。如果要让外部可以访问模块里面的方法或者属性,就必须在模块里面通
    过 exports 或者 module.exports 暴露属性或者方法。
    m1.js:

const name='gp19'
const sayName= () => {
	console.log(name)
}
console.log('module 1')
// 接口暴露方法一:
module.exports = {
	say:sayName
}
// 接口暴露方法二:
exports.say =sayName
// 错误!
exports = {
	say:sayName
}

main.js:

const m1 = require('./m1')
m1.say()

4. Npm&Yarn

  1. npm的使用
npm init
npm install 包名 –g (uninstall,update)
npm install 包名 --save-dev (uninstall,update)
npm list -g (不加-g,列举当前目录下的安装包)
npm info 包名(详细信息) npm info 包名 version(获取最新版本)
npm install md5@1(安装指定版本)
npm outdated( 检查包是否已经过时)
	"dependencies": { "md5": "^2.1.0" } ^ 表示 如果 直接npm install 将会 安md5 2.*.* 最新版本
	"dependencies": { "md5": "~2.1.0" } ~ 表示 如果 直接npm install 将会 安装md5 2.1.* 最新版本
	"dependencies": { "md5": "*" } * 表示 如果 直接npm install 将会 安装 md5最新版本
  1. 全局安装 nrm

NRM (npm registry manager)是npm的镜像源管理工具,有时候国外资源太慢,使用这个就可以 快速地在 npm源间切换。
手动切换方法: npm config set registry https://registry.npm.taobao.org

安装 nrm
在命令行执行命令,npm install -g nrm,全局安装nrm。
使用 nrm
执行命令 nrm ls 查看可选的源。 其中,带*的是当前使用的源,上面的输出表明当前源是官方源。
切换 nrm
如果要切换到taobao源,执行命令nrm use taobao。
测试速度
你还可以通过 nrm test 测试相应源的响应时间。

nrm test
扩展:
中国NPM镜像
这是一个完整的npmjs.org镜像,你可以用此代替官方版本(只读),同步频率目前为10分钟一次以保证尽量与官方服务同步。
npm install -g cnpm --registry=https://registry.npmmirror.com

  1. yarn使用

npm install -g yarn
对比npm:
  速度超快: Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。
  超级安全: 在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。
开始新项目
  yarn init
添加依赖包
  yarn add [package]
  yarn add [package]@[version]
  yarn add [package] --dev
升级依赖包
  yarn upgrade [package]@[version]
移除依赖包
  yarn remove [package]
安装项目的全部依赖
  yarn install

5. 内置模块

  1. http模块

要使用 HTTP 服务器和客户端,则必须 require(‘http’) 。

const http = require('http');
// 创建本地服务器来从其接收数据
const server = http.createServer((req, res) => {
	res.writeHead(200, { 'Content-Type': 'application/json' });
	res.end(JSON.stringify({
		data: 'Hello World!'
	}));
});
server.listen(8000);
const http = require('http');
// 创建本地服务器来从其接收数据
const server = http.createServer();
// 监听请求事件
server.on('request', (request, res) => {
	res.writeHead(200, { 'Content-Type': 'application/json' });
	res.end(JSON.stringify({
		data: 'Hello World!'
	}));
});
server.listen(8000);
  1. url模块

(1) parse

const url = require('url')
const urlString = 'https://www.baidu.com:443/ad/index.html?
id=8&name=mouse#tag=110'
const parsedStr = url.parse(urlString)
console.log(parsedStr)

(2) format

const url = require('url')
const urlObject = {
	protocol: 'https:',
	slashes: true,
	auth: null,
	host: 'www.baidu.com:443',
	port: '443',
	hostname: 'www.baidu.com',
	hash: '#tag=110',
	search: '?id=8&name=mouse',
	query: { id: '8', name: 'mouse' },
	pathname: '/ad/index.html',
	path: '/ad/index.html?id=8&name=mouse'
}
const parsedObj = url.format(urlObject)
console.log(parsedObj)

(3) resolve

const url = require('url')
var a = url.resolve('/one/two/three', 'four') ( 注意最后加/ ,不加/的区别 )
var b = url.resolve('http://example.com/', '/one')
var c = url.resolve('http://example.com/one', '/two')
console.log(a + "," + b + "," + c)
  1. querystring模块

(1) parse

const querystring = require('querystring')
var qs = 'x=3&y=4'
var parsed = querystring.parse(qs)
console.log(parsed)

(2) stringify

const querystring = require('querystring')
var qo = {
	x: 3,
	y: 4
}
var parsed = querystring.stringify(qo)
console.log(parsed)

(3) escape/unescape
node.js
node.js

const querystring = require('querystring')
var str = 'id=3&city=北京&url=https://www.baidu.com'
var escaped = querystring.escape(str)
console.log(escaped)
const querystring = require('querystring')
var str =
'id%3D3%26city%3D%E5%8C%97%E4%BA%AC%26url%3Dhttps%3A%2F%2Fwww.baidu.com'
var unescaped = querystring.unescape(str)
console.log(unescaped)
  1. http模块补充

(1) 接口:jsonp

const http = require('http')
const url = require('url')
const app = http.createServer((req, res) => {
	let urlObj = url.parse(req.url, true)
	switch (urlObj.pathname) {
		case '/api/user':
			res.end(`${urlObj.query.cb}({"name": "gp145"})`)
			break
		default:
			res.end('404.')
			break
	}
})
app.listen(8080, () => {
	console.log('localhost:8080')
})

(2) 跨域:CORS

const http = require('http')
const url = require('url')
const querystring = require('querystring')
const app = http.createServer((req, res) => {
	let data = ''
	let urlObj = url.parse(req.url, true)
	res.writeHead(200, {
		'content-type': 'application/json;charset=utf-8',
		'Access-Control-Allow-Origin': '*'
	})
	req.on('data', (chunk) => {
		data += chunk
	})
	req.on('end', () => {
		responseResult(querystring.parse(data))
	})
	function responseResult(data) {
		switch (urlObj.pathname) {
			case '/api/login':
				res.end(JSON.stringify({
					message: data
				}))
				break
			default:
				res.end('404.')
				break
		}
	}
})
app.listen(8080, () => {
	console.log('localhost:8080')
})