Node.js使用笔记

一:版本管理

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,在搜索结果右键,以管理员身份运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sun_qqq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值