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 相关文章推荐
网站被黑的假象--ARP欺骗之页面中加入一段js
May 16 Javascript
SinaEditor使用方法详解
Dec 28 Javascript
将form表单中的元素转换成对象的方法适用表单提交
May 02 Javascript
jQuery unbind 删除绑定事件详解
May 24 Javascript
基于jPlayer三分屏的制作方法
Dec 21 Javascript
JQuery统计input和textarea文字输入数量(代码分享)
Dec 29 Javascript
详解axios在node.js中的post使用
Apr 27 Javascript
webpack 2.x配置reactjs基本开发环境详解
Aug 08 Javascript
React-router v4 路由配置方法小结
Aug 08 Javascript
利用jsonp与代理服务器方案解决跨域问题
Sep 14 Javascript
微信禁止下拉查看URL的处理方法
Sep 28 Javascript
vue实现div单选多选功能
Jul 16 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如何解决网站大流量与高并发的问题
2011/06/25 PHP
PHP采集类Snoopy抓取图片实例
2014/06/19 PHP
PHP7数组的底层实现示例
2019/08/25 PHP
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
浅析Node.js中的内存泄漏问题
2015/06/23 Javascript
浅谈jQuery中height与width
2015/07/06 Javascript
深入解读JavaScript中的Hoisting机制
2015/08/12 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
从0开始学Vue
2016/10/27 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
js实现弹窗暗层效果
2017/01/16 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
jQuery 实现扁平式小清新导航
2020/07/07 jQuery
[01:32]dota2拉比克至宝(222)
2018/12/20 DOTA
python元组操作实例解析
2014/09/23 Python
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
用Python中的字典来处理索引统计的方法
2015/05/05 Python
python利用datetime模块计算时间差
2015/08/04 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
Python日期时间对象转换为字符串的实例
2018/06/22 Python
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
树莓派极简安装OpenCv的方法步骤
2019/10/10 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
2020/02/14 Python
超全Python图像处理讲解(多模块实现)
2020/04/13 Python
python 如何引入协程和原理分析
2020/11/30 Python
交通文明倡议书
2014/05/16 职场文书
减负增效提质方案
2014/05/23 职场文书
岗位说明书标准范本
2014/07/30 职场文书
社区文艺活动方案
2014/08/19 职场文书
实习协议书范本
2014/09/25 职场文书
个人先进事迹材料范文
2014/12/29 职场文书