我的博客

Hexo ftpsync错误分析

目录
  1. 背景
  2. 问题描述
  3. 寻找问题
    1. jsftp
    2. ftpsync
  4. 解决方案(临时)
  5. 快速解决

背景

因为一些问题我的博客突然要从wordpress换到hexo。

用的是百度云的PHP主机,感觉他的ftp本身有些问题,中文路径有乱码,然后有的乱码是可以访问到的,只是在我的WinSCP中显示不正常,可以通过http访问到,hexo的ftpsycn读取到的路径也是正常的,但是有那么几篇文章实在不知道为什么,显示也是乱码,ftpsync读取异常,用WinSCP还删不掉,用百度云的控制台里的删除操作总算删掉了(有一个文件删了多次删不掉,过了一会又自动消失)。再次执行hexo d 命令进行部署,结果committing部分,创建文件夹统统成功,之后就无任何显示了,ctrl + c 终止后,再次执行,发现还是不行,而且Committing后无任何输出,只是卡着不动了。ftp日志又是空的,或许又是百度云的什么bug。

问题描述

执行hexo d命令,到committing部分上传文件时卡住,无任何输出也不能成功上传。

寻找问题

jsftp

http://k99k.com/2015/hexo-ftpsync-bug/ 这篇文章里介绍了博主调试ftpsync的过程,我也准备试一下。

先从jsftp开始,进入博客工程的node_modules\jsftp\lib\目录,打开jsftp.js 文件,估计是上传文件时的问题,看Ftp.prototype.put方法(477行)。在函数中添加console.log确定执行的情况。发现这个函数比较正常,最终调用了emitProgress后进入文件传输的异步过程。这项目再github上又34个open issue,有一些关于put的问题,但是没有与我情况相同的,他们的至少会报个错误,我这个完全卡住了,又没输出,我用WinSCP登上以后发现创建了相应文件但是文件大小为0。好像是网络问题,但是我使用WinSCP传输很快。百度云这个ftp log又不正常,所以卡住了

只好再看ftpsync

ftpsync

进入工程的node_modules\ftpsync\lib\打开ftpsync.js文件。

这个模块写的很简洁,run方法中使用async模块的series方法依次执行了setup(建立ftp连接),collect(遍历本地目录和远端目录),consolidate(比较两边的文件,得出Mkdir,Rmdir,Add,Updates,Remove五个list),commit(进行对远端进行文件操作),我的程序就卡在了commit里了。commit上传文件时调用了utils的upload方法,该方法调用了jsftp的put方法,然后卡住。

各种尝试也不行,自己写demo使用jsftp上传文件也不行,看来是jsftp与百度云的php主机的ftp server不对付。又找来另一个ftp库试了一下可以上传,于是考虑直接使用新库替掉jsftp来做上传工作,其他的还是让jsftp来做。

解决方案(临时)

修改node_modules\ftpsync\lib\ftpsync.js

  1. 开头添加
1
2
var Client = require('ftp');
var ftpc = new Client();
  1. sync的setup中在try里面,ftp全局对象的初始化下面添加对我上面定义的ftpc全局变量的初始化
1
2
3
4
5
6
ftpc.connect({
host:settings.host,
user: settings.user,
password: settings.pass,
port: settings.port
});
  1. utils的upload方法中把原来的ftp.put(…… 这一句替换成使用ftpc的put
1
2
3
4
5
6
7
8
9
10
ftpc.put(local, remote, function(err) {
if (err) {
sync.log.error('ftp.put failed.');
return callback(err);
}
if (sync.log.verbose) {
sync.log.write('-', file, 'uploaded successfuly');
}
callback();
});
  1. 在utils的remove方法的最后添加关闭ftpc
1
ftpc.end();
  1. 安装依赖,因为我们引入了ftp所以 npm install ftp --save

快速解决

  1. 使用这段代码<https://paste.ubuntu.com/p/xzdWHDyzV4/>替换 node_modules\ftpsync\lib\ftpsync.js
  2. 在终端或cmd中执行 npm install ftp --save

评论无需登录,可以匿名,欢迎评论!