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 相关文章推荐
新闻内页-JS分页
Jun 07 Javascript
jquery 锁定弹出层实现代码
Feb 23 Javascript
在chrome中window.onload事件的一些问题
Mar 01 Javascript
JavaScript中的16进制字符(改进)
Nov 21 Javascript
jQuery图片播放8款精美插件分享
Feb 17 Javascript
使用非html5实现js板连连看游戏示例代码
Sep 22 Javascript
jquery Tab效果和动态加载的简单实例
Dec 11 Javascript
jquery实现简单的二级导航下拉菜单效果
Sep 07 Javascript
Angular项目中$scope.$apply()方法的使用详解
Jul 26 Javascript
dts文件中删除一个node或属性的操作方法
Aug 05 Javascript
javascript 数组精简技巧小结
Feb 26 Javascript
基于Element封装一个表格组件tableList的使用方法
Jun 29 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
上海牌131型七灯四波段四喇叭一级收音机
2021/03/02 无线电
php的计数器程序
2006/10/09 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
2015/07/09 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
2017/08/18 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
js 去掉空格实例 Trim() LTrim() RTrim()
2014/01/07 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
js动态引入的四种方法
2018/05/05 Javascript
基于游标的分页接口实现代码示例
2018/11/12 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
python 参数列表中的self 显式不等于冗余
2008/12/01 Python
详解Python中with语句的用法
2015/04/15 Python
使用Python设置tmpfs来加速项目的教程
2015/04/17 Python
Python文件与文件夹常见基本操作总结
2016/09/19 Python
Python操作MySQL模拟银行转账
2018/03/12 Python
Python开发的十个小贴士和技巧及长常犯错误
2018/09/27 Python
python django框架中使用FastDFS分布式文件系统的安装方法
2019/06/10 Python
python django下载大的csv文件实现方法分析
2019/07/19 Python
django-crontab实现服务端的定时任务的示例代码
2020/02/17 Python
通过python连接Linux命令行代码实例
2020/02/18 Python
董事长秘书职责
2014/01/31 职场文书
大学生党员自我评价范文
2014/04/09 职场文书
《陈涉世家》教学反思
2014/04/12 职场文书
电子专业自荐信
2014/07/01 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
高中生物教学反思
2016/02/20 职场文书
介绍信应该怎么开?
2019/04/03 职场文书
复制别人的成功真的会成功吗?
2019/10/17 职场文书
SQL试题 使用窗口函数选出连续3天登录的用户
2022/04/24 Oracle
Redis基本数据类型Set常用操作命令
2022/06/01 Redis