如果我尝试超过10个文件,我得到了警告,但其他文件没有上传,我不能上传超过10个文件。我做错了什么?
{节点:17472) MaxListenersExceededWarning:检测到可能的EventEmitter内存泄漏。添加了11个就绪的侦听器。使用emitter.setMaxListeners()增加限制(节点:17472) MaxListenersExceededWarning:检测到可能的EventEmitter内存泄漏。添加了11个错误监听程序。使用emitter.setMaxListeners()增加限制(节点:17472) MaxListenersExceededWarning:检测到可能的EventEmitter内存泄漏。添加了11个近距离监听程序。使用emitter.setMaxListeners()增加限制}
let Client = require('ssh2-sftp-client');
let sftp = new Client();
var promises = [];
for(var i=0; i < 12; i++) {
promises.push(sendFile(sftp, req.body, results.romlist[i].filename));
}
Promise.all(promises).then(function() {
sftp.end();
res.send('{"message":"OK"}');
});
const sendFile = (sftp, config, filename) => {
console.log(filename);
return sftp.connect(config).then(() => {
return sftp.put(filename, "/home/pi/RetroPie/roms/atari2600/" + filename.substr(filename.lastIndexOf('/')+1));
}).catch((err) => {
console.log(err, 'catch error');
});};
发布于 2018-05-25 13:27:35
下面的代码使用es6-promise-pool作为示例,它对我来说很有效:
首先需要安装es6-promise-pool:
npm install es6-promise-pool --save
代码:
let Client = require('ssh2-sftp-client');
let PromisePool = require('es6-promise-pool');
var files = [ (list of files to transfer) ]; // results.romlist[i].filename
var config = { (sftp config) };
const sendFile = (config, filename) => {
return new Promise(function (resolve, reject) {
let sftp = new Client();
console.log(filename);
sftp.on('keyboard-interactive', (name, instructions, instructionsLang, prompts, finish) => { finish([config.password]); });
sftp.connect(config).then(() => {
return sftp.put("(local path)" + filename, "/home/pi/RetroPie/roms/atari2600/" + filename);
}).then(() => {
console.log('finish '+filename);
sftp.end();
resolve(filename);
}).catch((err) => {
console.log(err, 'catch error');
});
});
};
var count = 0;
var sendFileProducer = function () {
console.log("count="+count);
if (count < 100) {
count++;
return(sendFile(config, files[count]));
} else {
return null;
}
}
// The number of promises to process simultaneously.
var concurrency = 10;
// Create a pool.
var pool = new PromisePool(sendFileProducer, concurrency)
pool.start().then(function () {
console.log({"message":"OK"}); // res.send('{"message":"OK"}');
});
代码没有针对网络流量进行优化,因为它会为每个文件启动SFTP。但是,它仍然是非常有效的,因为您可以控制适合不同情况的并发。
发布于 2020-05-30 05:22:51
这对我来说很有效:https://github.com/theophilusx/ssh2-sftp-client/issues/73
const putFiles = (sftpConfig, fileList) => {
const sftp = new sftpClient()
return new Promise(function(resolve, reject) {
sftp
.connect(sftpConfig)
.then(() => {
return Promise.all(fileList.map(args => {
return sftp.put.apply(sftp, args)
}))
})
.then(() => sftp.end())
.then(resolve)
.catch(reject)
});
}
发布于 2020-09-12 11:58:03
npm包"sftp- upload “可以帮助我将一个目录中的10个以上的文件上传到远程服务器。你可以参考这个:https://www.npmjs.com/package/sftp-upload
请在nodejs中找到下面的示例代码,我已经测试过了,它可以工作。请用您的必填数据替换字段:
包含要上载到服务器的文件的目录(在本地系统中)的
要上载文件的远程目录中的
var SftpUpload = require('sftp-upload');
var fs = require('fs');
sftp2 = new SftpUpload({
host:'remote ip address',
username:'username',
password:'****',
path: '/user/Desktop/test1',
remoteDir: '/user/Desktop/test1',
excludedFolders: ['**/.git', 'node_modules'],
exclude: ['.gitignore', '.vscode/tasks.json'],
dryRun: false
});
sftp2.on('error', function(err) {
throw err;
})
.on('uploading', function(progress) {
console.log('Uploading', progress.file);
console.log(progress.percent+'% completed');
})
.on('completed', function() {
console.log('Upload Completed');
})
.upload();
此代码会将本地系统中"test1“目录中的所有文件复制到远程服务器中的"test1”目录中。如果远程服务器中不存在"test1“目录,则会自动创建该目录并复制文件。
如果"test1“目录中有子文件夹,那么该子文件夹及其内容也会被复制到远程机器上。
https://stackoverflow.com/questions/50521222
复制相似问题