我正在尝试使用nodejs(下面的基本工作代码)将文件复制到NFS挂载的目录中。将文件成功复制到NFS挂载后,promise链将中断而不会引发任何错误(promise链中的其他操作均未执行)。但是,Web服务器显示502错误的网关,表明发生了一些错误。
作为基本预防措施,我确保NAS上用户的UID和GID与客户端相同。
const fs = require('fs');
function myFunction(fileToCopy) {
return Promise.resolve()
.then(() => new Promise((resolve,reject) => {
let newFileName = uuid() + '.txt';
let fileReadStream = fs.createReadStream(fileToCopy),fileWriteStream = fs.createWriteStream('/mnt/' + newFileName,{ flags: 'w+',mode: 0o664 });
fileReadStream
.pipe(
fileWriteStream,{end: false}
);
fileReadStream
.on('end',() => {
console.log('end event copying file (logged)');
fileWriteStream.end();
})
.on('error',error => {
console.error('error reading image stream (not logged)');
fileWriteStream.end();
reject(error);
});
fileWriteStream
.on('finish',() => {
console.log('finished copying file (logged)');
resolve(fullFilename);
})
.on('error',error => {
console.log('error writing file (not logged)');
reject(error);
})
}))
}
Promise.resolve()
.then(() => {
let array = ['file1','file2','file3'];
return Promise.all(
array.map(file => myFunction(file))
);
})
.then(() => console.log('never gets logged'))
.catch(error => console.error('error never gets logged'));
编辑1:作为一点附加信息,如果已卸载NFS NAS目录,并将/mnt
保留在本地系统上,则上述代码有效(承诺链完成,记录never gets logged
)。
编辑2:修改了代码以包含强制的“结束”事件,并在最小的工作示例中添加了一些其他代码以显示更多上下文。