node.js自动上传ftp的脚本分享


Posted in Javascript onJune 16, 2018

起因

刚加入一个小组的项目开发,开发环境是基于node环境,通过webpack打包构建代码,然后上传sftp,在浏览器测试。这种开发模式无可厚非,但是每次修改源代码,然后build,然后upload,不胜其烦。之前项目中有过 gulp-sftp任务脚本,然而并不是生效。于是自力更生,另谋他法,搞一个自动上传sftp的服务脚本。

设想

因为基于webpack,所以直接启动webpack编译的watch监听即可,在watch回调里执行stfp的上传,上传去npm社区找一个sftp的客户端插件

实现

使用了插件ssh2-sftp-client,文档有使用说明和api

写书写了一个 sftp 模块,连接完,直接导出

const Client = require('ssh2-sftp-client');
const fs = require('fs');

const sftp = new Client();
sftp
 .connect({
 host: '0.0.0.0', // ftp服务器ip地址
 port: '22', // ftp服务器port
 username: 'yourname', // 你的登录用户名
 password: 'yourpass', // 你的密码
 privateKey: fs.readFileSync('/Users/yourname/.ssh/id_rsa'), // 私钥
 passphrase: 'yourpass', // 私钥密码
 })
 .then(() => {
 console.log('ftp文件服务器连接成功');
 })
 .catch(err => {
 console.log(err, 'catch error');
 });

module.exports = sftp;

然后在webpack的watch里进行 上传文件即可,关于上传文件,图片的等类型需要使用Buffer类型上传,做一个特殊处理

const path = require('path');
const fs = require('fs');
const yargs = require('yargs');
const webpack = require('webpack');
const webpackConfig = require('./webpack.prod.config');
const sftp = require('./sftp');

const user = yargs.argv.user || '';

console.log(user);

const staticFilesPath = {
 js: {
 local: path.resolve(__dirname, '../dist/js'),
 remote: `/upload_code/${user}/static/mobile/js/dist`,
 },
 css: {
 local: path.resolve(__dirname, '../dist/css'),
 remote: `/upload_code/${user}/static/mobile/css/`,
 },
 img: {
 local: path.resolve(__dirname, '../dist/images'),
 remote: `/upload_code/${user}/static/mobile/images/`,
 },
};

let isFirstBuild = true;

const compiler = webpack(webpackConfig);
const watching = compiler.watch(
 {
 ignored: /node_modules/,
 aggregateTimeout: 100,
 poll: 1000,
 },
 (err, stats) => {
 if (err || stats.hasErrors()) {
  console.log(err);
 }
 console.log('编译成功!');
 if (isFirstBuild) {
  isFirstBuild = false;
  return;
 }
 console.log('正在上传...');
 uploadFile()
  .then(() => {
  console.log('------所有文件上传完成!-------\n');
  })
  .catch(() => {
  console.log('------上传失败,请检查!-------\n');
  });
 }
);
/**
* 处理文件路径,循环所有文件,如果是图片需要读取成Buffer类型
**/
function handleFilePath(obj, type) {
 const { local, remote } = obj;
 const files = fs.readdirSync(local);
 return files.map(file => {
 const _lp = `${local}/${file}`;
 return {
  type: type,
  file: file,
  localPath: type !== 'img' ? _lp : fs.readFileSync(_lp),
  remotePath: `${remote}/${file}`,
 };
 });
}
/**
* 上传文件
**/
function uploadFile() {
 let files = [];

 Object.keys(staticFilesPath).forEach(key => {
 files = files.concat(handleFilePath(staticFilesPath[key], key));
 });

 const tasks = files.map(item => {
 return new Promise((resolve, reject) => {
  sftp
  .put(item.localPath, item.remotePath)
  .then(() => {
   console.log(`${item.file}上传完成`);
   resolve();
  })
  .catch(err => {
   console.log(`${item.file}上传失败`);
   reject();
  });
 });
 });

 return Promise.all(tasks);
}

注意点:

  • 连接sftp服务器,推荐使用 私钥文件连接,使用password出错可能性比较大
  • 上传文件部分,目前不支持上传一个目录,所以需要循环处理文件
  • 上传文件部分,容易出错,一定要保证远端服务器存在对应目录,目前插件没有自动创建目录的机制

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
5款Javascript颜色选择器
Oct 25 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
Jun 27 Javascript
Ext GridPanel加载完数据后进行操作示例代码
Jun 17 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
Aug 25 Javascript
JQuery EasyUI的使用
Feb 24 Javascript
javascript html实现网页版日历代码
Mar 08 Javascript
JavaScript拖动层Div代码
Mar 01 Javascript
javascript 封装Date日期类实例详解
May 28 Javascript
使用D3.js制作图表详解
Aug 13 Javascript
微信小程序实现传参数的几种方法示例
Jan 10 Javascript
JavaScript布尔运算符原理使用解析
May 06 Javascript
JavaScript高级程序设计之变量与作用域
Nov 17 Javascript
Vue中props的使用详解
Jun 15 #Javascript
基于jQuery实现的设置文本区域的光标位置
Jun 15 #jQuery
深入浅析Vue全局组件与局部组件的区别
Jun 15 #Javascript
react-native android状态栏的实现
Jun 15 #Javascript
JS实现监控微信小程序的原理
Jun 15 #Javascript
vue .sync修饰符的使用详解
Jun 15 #Javascript
vue项目webpack中Npm传递参数配置不同域名接口
Jun 15 #Javascript
You might like
PHP 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
thinkphp5框架实现的自定义扩展类操作示例
2019/05/16 PHP
JavaScript 判断指定字符串是否为有效数字
2010/05/11 Javascript
JQuery 操作select标签实现代码
2010/05/14 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
2013/08/09 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
js中class的点击事件没有效果的解决方法
2016/10/13 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
vue 标签属性数据绑定和拼接的实现方法
2018/05/17 Javascript
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
2020/12/04 Vue.js
详解javascript脚本何时会被执行
2021/02/05 Javascript
python对日志进行处理的实例代码
2018/10/06 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
2019/08/23 Python
python多线程实现TCP服务端
2019/09/03 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
django修改models重建数据库的操作
2020/03/31 Python
IE下实现类似CSS3 text-shadow文字阴影的几种方法
2011/05/11 HTML / CSS
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
银行职员思想汇报
2013/12/31 职场文书
趣味游戏活动方案
2014/02/07 职场文书
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
寄语是什么意思
2014/04/10 职场文书
教师评语大全
2014/04/28 职场文书
工作推荐信模板
2015/03/25 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
关于运动会的宣传稿
2015/07/23 职场文书
SpringBoot集成Redis,并自定义对象序列化操作
2021/06/22 Java/Android
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP