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实现的分页函数
Dec 22 Javascript
jQuery 学习第五课 Ajax 使用说明
May 17 Javascript
在jQuery1.5中使用deferred对象 着放大镜看Promise
Mar 12 Javascript
在JavaScript中监听IME键盘输入事件
May 29 Javascript
js获取光标位置和设置文本框光标位置示例代码
Jan 09 Javascript
JavaScript插件化开发教程(六)
Feb 01 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
Apr 05 Javascript
javascript实现瀑布流动态加载图片原理
Aug 12 Javascript
详解vue组件化开发-vuex状态管理库
Apr 10 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
Jun 04 Javascript
JS实现百度搜索接口及链接功能实例代码
Feb 02 Javascript
ES6之模版字符串的具体使用
May 17 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
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
使用php4加速网络传输
2006/10/09 PHP
PHP7.0版本备注
2015/07/23 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
2018/10/23 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
jQuery 借助插件Lavalamp实现导航条动态美化效果
2013/09/27 Javascript
使用jQuery时Form表单元素ID和name命名大忌
2014/03/06 Javascript
NodeJS学习笔记之网络编程
2014/08/03 NodeJs
window.location 对象所包含的属性
2014/10/10 Javascript
jQuery实现ichat在线客服插件
2014/12/29 Javascript
jQuery选择器源码解读(五):tokenize的解析过程
2015/03/31 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
JS中判断null的方法分析
2016/11/21 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
2017/02/08 Javascript
Ionic+AngularJS实现登录和注册带验证功能
2017/02/09 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
原生JS实现轮播图效果
2018/10/12 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
JavaScript:ES2019 的新特性(译)
2019/08/08 Javascript
微信小程序class封装http代码实例
2019/08/24 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
Antd的Table组件嵌套Table以及选择框联动操作
2020/10/24 Javascript
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
对于Python中线程问题的简单讲解
2015/04/03 Python
教大家使用Python SqlAlchemy
2016/02/12 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
学校采购员岗位职责
2014/01/02 职场文书
服务员岗位责任制
2014/02/11 职场文书
动员大会主持词
2014/03/20 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
医院党建工作总结2015
2015/05/26 职场文书
js 实现验证码输入框示例详解
2022/09/23 Javascript