一:版本管理
Linux系统
可以通过添加n模块(node的版本管理器),来交互式地管理Node.js版本。
1、首先,清除npm缓存:
npm cache clean -f
2、安装n模块,即Node的版本管理器:
npm install -g n
3、安装了n模块后,你可以使用它来安装最新的稳定版本:
n stable // 安装最新版本的node后,GLIBC可能也要跟着更新才行
4、也可以安装指定版本:
n [version.number] // n v13.2
window系统
1、官方历史版本地址
2、下载路径:https://github.com/coreybutler/nvm-windows/releases
3、下载位置为Assets标题下的 nvm-setup.exe
4、 安装向导中,第一个安装路径可以自定义选,就是一般的安装路径。
第二个路径会自动配置环境变量,最好不要修改。否则node -v 提示找不到命令
5、常用命令如下
nvm -v
nvm install 22.5.1
nvm list
nvm use v22.5.1
注意use某个版本时,一定要带v,v22.5.1
nvm自动会配置环境变量,但是刚安装好需要重启电脑后才能使用环境变量。
二:静态文件路径
原生node无法返回静态文件路径(可能是我不知道),如果使用express框架则方便很多。
将静态资源文件所在的目录作为参数传递给 express.static
中间件就可以提供静态资源文件的访问了。例如,假设在 public
目录放置了图片、CSS 和 JavaScript 文件,你就可以:
app.use(express.static('public'));
现在,public
目录下面的文件就可以访问了。
http://localhost:3000/images/a.jpg
三:Express规划路由
app.get('/list/:listname/:id',function(req,res,next){
var listname = req.params.listname;
var id = req.params.id;
res.send('This is' + listname + ':' + id);
});
http://localhost:1234/list/news/123
输出:This is news:123
http://localhost:8080/articlelist
http://localhost:8080/articlelist/management
四:关于接口token
博客的接口,前台不需要传token,后台需要传token验证身份。
可是前后台用的同一套接口,如何做到区分?
url传不同的参数,后台根据不同的参数判断。如果是前台只接收数据,然后操作数据库。如果是后台接收参数,并校验token,通过后才操作数据库。
五:设置跨域
npm install --save cors,然后在app.js文件中
var cors = require('cors');
app.use(cors());
注意,这个代码一定要,写在注册路由的前面。此模块也可以,当做路由中间件,指定某一个,或者某一部分路由,拥有跨域功能。
六:莫名的找不到模块
运行的好好的,突然报报找不到模块,莫名其妙的根本就没有用到这个模块。直接删掉node-module文件夹。重装所有模块即可
七:生产运维
直接用nodeJS原生语法起服务,存在一段时间断开等问题。
可以使用pm2、forever等工具解决服务不持久的问题。我一直在用forever
1、forever操作进程
启动服务:forever start index.js
停止服务:forever stop index.js
重启服务:forever restart index.js
2、forever管理多个进程
- 查看所有进程
所有进程:forever list
- 杀掉某个forever服务
直接kill命令是关不掉forever起的进程的,首先需要根据文件名,找到某个进程。然后用forever的命令来杀掉进程。
如下为一个进程列表实例,可以根据command中的文件路径,找到某个进程的pid,比如10869
data: uid command script forever pid id logfile
data: [0] kAIP /usr/local/node/bin/node app.js 6779 10869 /root/.forever/kAIP.log
data: [1] wMGv /usr/local/node/bin/node index.js 16451 1599 /root/.forever/wMGv.log
forever stop 10869 // 才能停掉这个服务,直接kill命令是关不掉的
八:Node实现静态资源服务器
/**
* author:sunquan
*
* 本文件实现一个静态服务器,对于文件类请求直接响应展示,对于Ajax类请求转发并响应对应数据;
*/
let http = require('http');
let url = require('url');
let util = require('util');
let fs = require('fs');
let mime = require('mime');
let path = require('path');
let axios = require('axios');
let querystring = require('querystring');
let server = http.createServer((req, res) => {
let pathname = url.parse(req.url).pathname,
UrlType = pathname.split('/'), //辨别请求是不是ajax,本应用ajax请求都有aqi标记,具体使用时需要根据情况修改此处
ProxyedUrl = pathname.replace(/\/api/, 'http://39.104.22.73:8888'), //指向后后的url
ext = path.parse(pathname).ext,
mimeType = mime.getType(ext);
if (UrlType[1] == 'api') {
//我的前端请求接口url需要代理,url会添加api,需要将url替换并转发
let post = '';
req.on('data', function (chunk) {
post += chunk;
});
req.on('end', function () {
axios.post(
pathname.replace(/\/api/, 'http://39.104.22.73:8888'),
JSON.parse(post)
).then(function (response) {
res.end(JSON.stringify(response.data));
}).catch(function (e) {
console.log('ajax error');
});
});
} else if (UrlType[1] == '') {
ReadAndResponse('index.html',res,mimeType);
} else {
ReadAndResponse(pathname.substring(1),res,mimeType);
}
});
server.listen(67);
/**
* 读取文件,并在服务中响应对应的文件
* @param filePath 文件路径
* @param response 响应对象
* @param fileType 文件类型
* @constructor
*/
function ReadAndResponse(filePath,response,fileType){
fs.readFile(filePath, (err, data) => {
if (err) {
// 错误就返回404状态码
response.writeHead(404, {
'Content-Type': fileType
})
} else {
// 成功读取文件
response.writeHead(200, {
'Content-Type': fileType
})
// 展示文件数据
response.write(data);
}
// 注意,这个end 一定要放在读取文件的内部使用
response.end();
});
}
九:提示'node' 不是内部或外部命令
在系统变量框框里的path栏目 加入一行记录 C:\Program Files\nodejs(安装路径) 就行。
切记每次配置了都要重新打开cmd,不要用之前的窗口检测 node -v
十:报错信息
1、No valid exports
我装了一个将excel转为json的插件,在本地测试没问题,放在服务器上就报错
报错信息如下:
Error: No valid exports main found for '/var/ftp/test/sunquan/SunQBlog-ServerSide/node_modules/xlsx'
死活找不到原因,后来发现本地node版本跟服务器上node版本不同,后来通过n工具统一服务起的node版本后解决
2、operation not permitted
权限不足时,以管理员身份运行。
window左下角搜索框中输入cmd,在搜索结果右键,以管理员身份运行