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 相关文章推荐
Extjs ajax同步请求时post方式参数发送方式
Aug 05 Javascript
js 自定义的联动下拉框
Feb 07 Javascript
通过继承IHttpHandle实现JS插件的组织与管理
Jul 13 Javascript
Jquery获取复选框被选中值的简单方法
Jul 04 Javascript
Javascript中Event属性搜集整理
Sep 17 Javascript
jquery实现公告翻滚效果
Feb 27 Javascript
JS实现兼容性好,自动置顶的淘宝悬浮工具栏效果
Sep 18 Javascript
JS 实现可停顿的垂直滚动实例代码
Nov 23 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
Dec 21 Javascript
vue实现购物车小案例
Sep 27 Javascript
微信小程序绑定手机号获取验证码功能
Oct 22 Javascript
JavaScript 如何在浏览器中使用摄像头
Dec 02 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中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
PHP+memcache实现消息队列案例分享
2014/05/21 PHP
php session 写入数据库
2016/02/13 PHP
php图片添加水印例子
2016/07/20 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
2020/04/14 PHP
JavaScript的目的分析
2007/01/05 Javascript
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
javascript学习笔记(一)基础知识
2014/09/30 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
2015/11/06 Javascript
jQuery模拟select实现下拉菜单功能
2016/06/20 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
2017/01/23 Javascript
jQuery plugin animsition使用小结
2017/09/14 jQuery
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
七行JSON代码把你的网站变成移动应用过程详解
2019/07/09 Javascript
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
[03:40]DOTA2抗疫特别篇《英雄年代》
2020/02/28 DOTA
初步讲解Python中的元组概念
2015/05/21 Python
Python设计模式之解释器模式原理与用法实例分析
2019/01/10 Python
Pythony运维入门之Socket网络编程详解
2019/04/15 Python
python 字典操作提取key,value的方法
2019/06/26 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
拉丁舞学习者的自我评价
2013/10/27 职场文书
城市轨道交通工程职业规划书范文
2014/01/18 职场文书
优乐美广告词
2014/03/14 职场文书
逃课检讨书
2015/01/26 职场文书
简爱读书笔记
2015/06/26 职场文书
nginx配置文件使用环境变量的操作方法
2021/06/02 Servers
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android
pt-archiver 主键自增
2022/04/26 MySQL