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 相关文章推荐
ImageZoom 图片放大镜效果(多功能扩展篇)
Apr 14 Javascript
JavaScript开发规范要求(规范化代码)
Aug 16 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
Apr 14 Javascript
js string 转 int 注意的问题小结
Aug 15 Javascript
jQuery 仿百度输入标签插件附效果图
Jul 04 Javascript
快速学习jQuery插件 Form表单插件使用方法
Dec 01 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
Jan 20 Javascript
jQuery ajax提交Form表单实例(附demo源码)
Apr 06 Javascript
easyui messager alert 三秒后自动关闭提示的实例
Nov 07 Javascript
微信小程序生成分享海报方法(附带二维码生成)
Mar 29 Javascript
webpack自动打包和热更新的实现方法
Jun 24 Javascript
微信小程序背景音乐开发详解
Dec 12 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/21 PHP
wamp安装后自定义配置的方法
2014/08/23 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
javascript import css实例代码
2008/07/18 Javascript
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
JavaScript自定义事件介绍
2013/08/29 Javascript
jquery统计复选框选中示例
2013/11/05 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
js 实现复选框只能选择一项的示例代码
2018/01/23 Javascript
vue非父子组件通信问题及解决方法
2018/06/11 Javascript
简述JS浏览器的三种弹窗
2018/07/15 Javascript
简述JS控制台的使用
2018/07/15 Javascript
Net微信网页开发 使用微信JS-SDK获取当前地理位置过程详解
2019/08/26 Javascript
JS实现轮播图效果
2020/01/11 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
详解node.js创建一个web服务器(Server)的详细步骤
2021/01/15 Javascript
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
如何用border-image实现文字气泡边框的示例代码
2020/01/21 HTML / CSS
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
校园安全广播稿范文
2014/09/25 职场文书
龙潭大峡谷导游词
2015/02/10 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
JavaScript ES6的函数拓展
2022/01/18 Javascript