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中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
Aug 12 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
Aug 17 Javascript
基于JS实现仿百度百家主页的轮播图效果
Mar 06 Javascript
BootStrap表单宽度设置方法
Mar 10 Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
Sep 04 Javascript
JavaScript变量作用域及内存问题实例分析
Jun 10 Javascript
JavaScript一元正号运算符示例代码
Jun 30 Javascript
小程序使用watch监听数据变化的方法详解
Sep 20 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
Apr 03 Javascript
JavaScript中CreateTextFile函数
Aug 30 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
Nov 09 Javascript
JavaScript实现音乐播放器
Aug 14 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 程式大小
2006/12/06 PHP
php分页函数完整实例代码
2014/09/22 PHP
Javascript与PHP验证用户输入URL地址是否正确
2014/10/09 PHP
php获取当月最后一天函数分享
2015/02/02 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
PHP删除字符串中非字母数字字符方法总结
2019/01/20 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
javascript测试题练习代码
2012/10/10 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
js中的setInterval和setTimeout使用实例
2014/05/09 Javascript
全面解析Bootstrap布局组件应用
2016/02/22 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
Bootstrap CSS布局之按钮
2016/12/17 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
微信小程序实现简易table表格
2020/06/19 Javascript
JavaScript 实现同时选取多个时间段的方法
2019/10/17 Javascript
简单了解常用的JavaScript 库
2020/07/16 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
python 调用c语言函数的方法
2017/09/29 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
Python中os模块功能与用法详解
2020/02/26 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
新员工培训个人的自我评价
2013/10/09 职场文书
管理科学大学生求职信
2013/11/13 职场文书
销售助理岗位职责
2014/02/21 职场文书
环境工程专业自荐信
2014/03/03 职场文书
母婴店促销方案
2014/03/05 职场文书
大学同学聚会感言
2015/07/30 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书
2016年百日安全生产活动总结
2016/04/06 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL