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 相关文章推荐
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
Jan 13 Javascript
JS实现完全语义化的网页选项卡效果代码
Sep 15 Javascript
Bootstrap表单布局样式代码
May 31 Javascript
标准的js无缝滚动效果
Aug 30 Javascript
原生JS实现在线问卷调查投票特效
Jan 03 Javascript
JS基于面向对象实现的多个倒计时器功能示例
Feb 28 Javascript
angular仿支付宝密码框输入效果
Mar 25 Javascript
ES6学习教程之Map的常用方法总结
Aug 03 Javascript
seajs实现强制刷新本地缓存的方法分析
Oct 16 Javascript
vue.js 实现输入框动态添加功能
Jun 25 Javascript
js实现轮播图效果 z-index实现轮播图
Jan 17 Javascript
vuex分模块后,实现获取state的值
Jul 26 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 SEO优化之URL优化方法
2011/04/21 PHP
php的sprintf函数的用法 控制浮点数格式
2014/02/14 PHP
php中magic_quotes_gpc对unserialize的影响分析
2014/12/16 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
PHP删除字符串中非字母数字字符方法总结
2019/01/20 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
PHP+jQuery实现双击修改table表格功能示例
2019/02/21 PHP
鼠标划过实现延迟加载并隐藏层的js代码
2013/10/11 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
js设置和获取自定义属性的方法
2016/10/20 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
Angularjs修改密码的实例代码
2017/05/26 Javascript
vue.js中过滤器的使用教程
2017/06/08 Javascript
react-native-video实现视频全屏播放的方法
2018/03/19 Javascript
浅谈高大上的微信小程序中渲染html内容—技术分享
2018/10/25 Javascript
vue实现的组件兄弟间通信功能示例
2018/12/04 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
基于vue.js仿淘宝收货地址并设置默认地址的案例分析
2020/08/20 Javascript
[02:37]TI8勇士令状不朽珍藏II视频展示
2018/06/23 DOTA
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
2018/02/06 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
python实现超级马里奥
2020/03/18 Python
python上下文管理的使用场景实例讲解
2021/03/03 Python
HTML5 body设置全屏背景图片的示例代码
2020/12/08 HTML / CSS
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
大学生标准推荐信范文
2013/11/25 职场文书
党员干部群众路线个人整改措施
2014/09/18 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
党校团干班培训心得体会
2016/01/06 职场文书
2019职场单身人才调研报告:互联网行业单身比例最高
2019/08/07 职场文书
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL