Dry Realm

Get busy living

Category

  • DevOps
  • Javascript
  • Review
  • 一些技巧
  • 其它
  • 学习过程中的所感所想
  • 拼命学习
  • 那些年的所见所闻
  • 随笔

Tags

  • Node.js
  • MongoDB
  • linux
  • HTTP
  • typescript
  • 运维
  • docker
  • 面试总结
  • express
  • es6
  • Git
  • k8s
  • 数学
  • 负数
  • devcontainer
  • eslint
  • git
  • MySQL
  • Css
  • ntzyz大佬
  • review
  • 本地版博客
  • 数据库
  • 下载youtube
  • 离别
  • docker swarm
  • Gitlab Api
  • ECMA
  • 语句
  • 正则表达式
  • javascript
  • wsl2
  • 年度总结
  • 南京
  • 文字
  • 西安
  • 3rd-lib
  • 新博客框架
  • vscode
  • 大黑猫
  • 子网掩码
  • new life
  • jenkins pipeline
  • 网络
  • linux指令
  • 数据库连接
  • 第三方库
  • webpack

Recent replies

  • xzdry 发表于「使用ffmpeg和youtube-dl下载youtube视频」

友链

ntzyz double

我

真诚
很看重自己在乎的人
希望能越来越好
爱蛋蛋
标签:Node.js

把项目部署到服务器流程

2019 年 1 月 28 日分类:一些技巧#Node.js#HTTP#express#linux

使用的是ntzyz大佬的服务器。过程如下

第一步 拷贝文件到服务器

用scp(win10下用pscp)复制到服务器那边。放到目录/var/www/xzdry下,但是直接使用:

pscp E:\前端学习\github\playground\test1.html [email protected]:/var/www/xzdry

会因为没有权限而被拒绝。因此只能先传到/home/xzdry下。具体如下:

pscp E:\前端学习\github\playground\test1.html xxxx:
#输入密码

#传输完成

## 注:传输整个文件夹用-r命令

第二步 把文件复制到对应的文件夹下

这里主要涉及到几个常用的linux命令:

  • 拷贝文件用cp,拷贝整个文件夹则是cp -r
  • 如果只想拷贝文件夹下的内容而不拷贝文件夹,则用cp -rf xxx/* xxx
  • 删除文件用rm,删除文件夹为rm -rf 例子:
#文件从/home/xzdry下拷贝到/var/www/xzdry下,这里同样会有权限的问题,因此需要使用sudo
sudo cp test1.html /var/www/xzdry/example2/
# rm -rf xxx  #强制删除整个文件夹

详细语法:

cp [选项] 源文件或目录 目标文件或目录
说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。
该命令的各选项含义如下:
- a 该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。
- d 拷贝时保留链接。
- f 删除已经存在的目标文件而不提示。
- i 和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。
- p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。
- r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。
- l 不作拷贝,只是链接文件。
需要说明的是,为防止用户在不经意的情况下用cp命令破坏另一个文件,如用户指定的目标文件名已存在,用cp命令拷贝文件后,这个文件就会被新源文件覆盖,因此,建议用户在使用cp命令拷贝文件时,最好使用i选项。

第三步 挂在到后台

# 第一步
screen -S xxx  #如screen -S my_service

# 第二步 启动后端服务
node app.js

# 第三步 挂载到后台
# 按顺序按住Ctrl+A+D 就挂载到后台了

附其它命令:

# 从后台恢复 
screen -r xxx  #此处可填 进程序号或者进程名字。比如124624或gowhere_service

# 查看有哪些虚拟终端
screen -ls  # 例如结果:124624.gowhere_service  (Detached)

# 退出虚拟终端:在虚拟终端里输入
exit

更多关于screen的内容,参见: linux screen 命令详解 linux 技巧 linux 技巧

第四步 配置ngnix

后端配合使用静态文件,即用http的形式打开项目:

//app.js
app.use('/', express.static('./gowhere1')) //把当前目录下的项目挂载到http 3008端口

这样,项目就运行在本地3008端口,和后端同端口,就不存在https和http的跨域问题了。
然后,配置nginx,让https://www.xzdry.net/gowhere/#/反向代理到本机的3008端口, 把博客的/gowhere目录代理到3008端口,就可以直接在https://www.xzdry.net/gowhere/访问了。这样也不用一定要把项目放到博客的/static目录下了。只需要把博客下的/xxx代理到本机3008端口就可以了。
ngnix配置图:
这里我和nginx之间使用的是https通信,nginx和node则是http,nginx充当中间人的身份。
完成后systemctl restart nginx重启重新加载配置。

HTTP协议学习(实操1)

2018 年 12 月 31 日分类:拼命学习#HTTP#Node.js

CORS跨域请求的限制与解决

由于浏览器著名的同源策略的限制。当需要访问不同源的服务时,需要服务端允许跨域访问。下面是一个例子:

//server.js
const http = require('http');
const fs = require('fs');

http.createServer((req, res) => {
    console.log('request come', req.url);

    const html = fs.readFileSync('test.html', 'utf8');
    res.writeHead(200, {
        'Content-Type': 'text/html'
    })
    res.end(html);
}).listen(8888, () => {
    console.log('listened on port 8888');
})
//server2.js
const http = require('http');

http.createServer((req, res) => {
    console.log('request come', req.url);
    res.writeHead(200, {
        'Access-Control-Allow-Origin': '*'//不安全。允许所有
        'Access-Control-Allow-Origin': 'http://baidu.com' //只允许特定的服务跨域
    })

    res.end('123');
}).listen(8887)
MORE

vue-mongodb学习

2018 年 11 月 13 日分类:学习过程中的所感所想#MongoDB#Node.js#express

前言

正好最近换框架,接触到了mongodb数据库。然后就有了想法,之前学习的时候做的一个vue的个人博客框架项目使用的是mock,是一个网络版的数据库。初始目的是为了简便而言,操作数据库的话估计系统学习后端才会有涉及。但强迫症的我就是想把数据存放到本地,上B站找了两套视频,莫名其妙的看完了Node.js的初级知识,并写了两篇笔记:Node.js链接MongoDB练习小计以及Node.js学习。最后结果是依然不会(真滴辣鸡)。然后吧,放弃又不甘心。所以利用周末的这两天,又把菜鸟教程的node.js教程浅看了一遍,然后视频又看了一遍,总算是懂了一点点了。算入门了吧。因此就去github上找来一个项目,准备跟着做一遍,并记录笔记。希望最终能学会如果把数据从页面获取存到数据库里吧。
项目地址:一个简单的前后端分离案例

初始化

  • 使用vue-cli初始化项目目录 这里需要注意两点:
    • vue init webpack my-project是上一版vue cli的命令,目前为:vue create my-project。

    • npm run dev则变为npm run serve 启动就能看到vue.js的欢迎界面。

后端开发部分

下载必须的依赖:

npm i express body-parser mongoose --save

之后在根目录添加app.js,编写启动express服务器的代码。
使用nodemon,方便开发:

npm install nodemon --save

这里我之前已经安装到了全局。
浏览器访问3000端口,就会看到'yo',即表示成功。

moongose部分

因为只是想把数据库存到本地,所以没有特地去了解,有时间会去看文档了解。这里只简单说一下目前的理解。
我的理解是,使用mongodb库也可以做,但是不会区分数据类型,而使用mongoose可以通过新建Schema来为每个数据确定数据类型。操作如下:

  • 使用mongodb
const mc = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017/test_movie';
mc.connect(url, function (err, client) {
    if (err) throw err;
    var dbs = client.db();//这里不填则创建的数据库和url中一样,但是如果填写内容,则会优先以db()里的数据库名为准创建数据库。上面可以不填,只在这里填写。
    console.log('连接数据库成功');
    /** 可以省去
        dbs.createCollection('site', (err, r) => {
            if (err) throw err;
            console.log('创建数据集成功');
        });
     */

    var site = dbs.collection('post');//如果没有会自动创建数据集

    var data = {
        name: 'dry',
        age: 'nothing'
    }
    site.insertOne(data, (err, r) => {
        if (err) throw err;
        console.log('插入数据成功');
        client.close();
    })
})

有个很明显的问题,就是数据类型没有限定,age显然应该为大于等于0的正整数,因此需要mongoose(直接使用并不能完全解决问题,还需要自定义类型才可以)。
关于mongoose中的模式类型,见模式类型

  • 使用mongoose
const mongoose = require('mongoose');


const url = 'mongodb://localhost:27017/test_movie';

mongoose.connect(url, err => {
    if (err) throw err;
    var schema = mongoose.Schema({
        name: String,
        age: Number,
    });

    var test = mongoose.model('test', schema,'test');//创建数据集和数据模型,第三个参数不填会自动生成复数名称的数据集
    var data = {
        name: 'dry',
        age: '15'
    }
    test.create(data, (err, data1) => {
        console.log('添加数据成功');
        console.log(data1);
    })
})

这里需要注意三点:

  1. 如果是字符串型的数据,会自动转换为number类型进行存储
  2. 如果包含字母之类的,则值为undefined从而不会存储到数据集中
  3. model()中第三个参数不填,会自动根据模型名生成复数形式,所以要么第一个参数加s要么第三个参数填写正确的数据集名字

Node.js学习

2018 年 11 月 12 日分类:学习过程中的所感所想#Node.js

菜鸟教程里的粗略学习

EventEmitter

  • 格式
var events=require('events')
var event=new events.EventEmitter();//实例化

event.on('事件名',callback);//绑定事件[添加监听器]
event.emit('事件名');触发事件
MORE

Node.js学习

2018 年 11 月 4 日分类:学习过程中的所感所想#Node.js

全局变量

  • console.log
  • setTimeout,过x秒后执行
setTimeout(() => {
    console.log("2s passed");
}, 2000);//两秒后执行console
  • setInterval,每隔x秒执行。clearInterval,清除定时事件
var time = 0;
var timer = setInterval(() => {
    time++;
    console.log(`${time}秒过去了`);
    if (time > 10)
        clearInterval(timer);
}, 1000);
  • __dirname,__filename
console.log(__dirname);//输出当前文件所在目录
console.log(__filename);//输出当前文件的地址
  • require,export
MORE
  • «
  • 1
  • 2
  • »
Copyright © 2016-2018 ntzyz. All rights reversed.
Except where otherwise noted, content on this blog is licensed under CC-BY 2.0.