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 相关文章推荐
Mootools 1.2教程 排序类和方法简介
Sep 15 Javascript
JS设置cookie、读取cookie、删除cookie
Apr 17 Javascript
javascript实现五星评分功能
Nov 10 Javascript
Node.js中使用socket创建私聊和公聊聊天室
Nov 19 Javascript
js中作用域的实例解析
Mar 16 Javascript
利用Ionic2 + angular4实现一个地区选择组件
Jul 27 Javascript
AjaxUpLoad.js实现文件上传
Mar 05 Javascript
vue项目移动端实现ip输入框问题
Mar 19 Javascript
详解vue项目中实现图片裁剪功能
Jun 07 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
Jun 24 Javascript
原生js实现日期选择插件
May 21 Javascript
Vue axios 跨域请求无法带上cookie的解决
Sep 08 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
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
文件系统基本操作类
2006/11/23 PHP
php 上一篇,下一篇文章实现代码与原理说明
2010/05/09 PHP
PHP常用函数和常见疑难问题解答
2014/03/05 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
Javascript的闭包
2009/12/31 Javascript
juqery 学习之五 文档处理 插入
2011/02/11 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
JavaScript实现图片轮播的方法
2015/07/31 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
基于js中的原型(全面讲解)
2017/09/19 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
python实现批量修改文件名代码
2017/09/10 Python
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
国际政治个人自荐信范文
2013/11/26 职场文书
家长给幼儿园的表扬信
2014/01/09 职场文书
村党支部换届选举方案
2014/05/02 职场文书
酒店端午节活动方案
2014/08/26 职场文书
教师党员自我剖析材料
2014/09/29 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
会议室管理制度范本
2015/08/06 职场文书
某某幼儿园的教育教学管理调研分析报告
2019/11/29 职场文书
分享3个非常实用的 Python 模块
2022/03/03 Python
python_tkinter弹出对话框创建
2022/03/20 Python