上传文件时的节点- ftp复制操作



因为有所谓的"回调地狱"。这是我从服务器获取文件到vps电脑并上传的唯一方法。这个过程很简单:

  1. 从ftp服务器下载。json文件
  2. 在pc上编辑。json文件
  3. 上传。json文件并删除pc的副本。

然而,我的问题是:虽然它下载了一次,它返回的上传是基于我在一个会话期间命令它的次数(命令#1,执行一次,命令#2,执行两次,等等)。

我试图将其作为命令式运行,但被无效。不得不求助于回调地狱来正常运行代码。触发器可以初始化命令,但是命令和会话出错了。

((  //declaring my variables as parameters
ftp=new (require('ftp'))(),
fs=require('fs'),
serverFolder='./Path/Of/Server/',
localFolder='./Path/Of/Local/',
file='some.json',
{log}=console
)=>{
//run server if its ready
ftp.on('ready',()=>{
//collect a list of files from the server folder
ftp.list(serverFolder+file,(errList,list)=>
errList|| typeof list === 'object' &&
list.forEach($file=>
//if the individual file matches, resume to download the file
$file.name===file&&(
ftp.get(serverFolder+file,(errGet,stream)=>
errGet||(
log('files matched!  cdarry onto the operation...'),
stream.pipe(fs.createReadStream(localFolder+file)),
stream.once('close',()=>{
//check if the file has a proper size
fs.stat(localFolder+file,(errStat,stat)=>
errStat || stat.size === 0
//will destroy server connection if bytes = 0
?(ftp.destroy(),log('the file has no value'))
//uploads if the file has a size, edits, and ships
:(editThisFile(),
ftp.put(
fs.createReadStream(localFolder+file),
serverFolder+file,err=>err||(
ftp.end(),log('process is complete!')
))
//editThisFile() is a place-holder editor
//edits by path, and object                                    
)
})
)
)
)
)
);
});
ftp.connect({
host:'localHost',
password:'1Forrest1!',
port:'21',
keepalive:0,
debug: console.log.bind(console)
});
})()

主要问题是:由于某种原因,它会一遍又一遍地返回命令的副本作为'carry over'。

编辑:虽然"编程风格"的优点是不同于普通元的。所有这些都会导致同一个回调地狱的问题。任何建议都是必要的。为了提高可读性,我借助编辑代码的帮助来减轻难度。更好的可读性版本

ftp模块API导致回调地狱。它也有一段时间没有维护了,而且有很多bug。尝试一个模块的承诺,如basic-ftp

有了承诺,代码流变得更容易理解,错误也不需要特定的处理,除非你想要。

const ftp = require('basic-ftp')
const fsp = require('fs').promises
async function updateFile(localFile, serverFile){
const client = new ftp.Client()
await client.access({
host: 'localHost',
password: '1Forrest1!',
})
await client.downloadTo(localFile, serverFile)
const stat = await fsp.stat(localFile)
if (stat.size === 0) throw new Error('File has no size')
await editThisFile(localFile)
await client.uploadFrom(localFile, serverFile)
}
const serverFolder = './Path/Of/Server'
const localFolder = './Path/Of/Local'
const file = 'some.json'
updateFile(localFolder + file, serverFolder + file).catch(console.error)

相关内容

  • 没有找到相关文章

最新更新