我对下面的代码有两个问题,我写的代码是为了保存一些REST服务返回的JSON数据
问题1
在将一些REST服务返回的数据写入文件之前,我遇到了一种问题。问题不在于调用rest服务并获取数据。但是在写入目录 之前当我调用这个函数时,在跟踪中有一个错误" error: EISDIR:对目录进行非法操作,打开'/home/inttyl/data/'"
文件都正确保存在目录中我不明白为什么会有错误。
问题2
第二个问题是输出
我期待整个路径+ filename
成功写入文件::/home/inttyl/data/file1.js
而不仅仅是路径
成功写入文件::/home/inttyl/data/
谢谢你的帮助
这里的代码
services.forEach(function(currVal, index, array) {
fullUrl = url + currVal.path;
fullPath = dataDirectory + currVal.fileName;
console.log(" Processing writing to file:: " + fullPath);
request
.get(fullUrl)
.on("error", function(err) {
console.log(err);
})
.pipe(fs.createWriteStream(fullPath))
.on("error", function(err) {
console.log(" ERROR : wirting in file : " + fullPath);
console.log(" " + err);
})
.on("finish", function() {
console.log(" Successfully write to file: " + fullPath);
});
});
这里是我得到的痕迹:
Processing writing to file:: /home/inttyl/data/file1.js
Processing writing to file:: /home/inttyl/data/file2.js
Processing writing to file:: /home/inttyl/data/file3.js
Processing writing to file:: /home/inttyl/data/fil4.js
Processing writing to file:: /home/inttyl/data/fil5.js
Processing writing to file:: /home/inttyl/data/file6.js
Processing writing to file:: /home/inttyl/data/file7.js
Processing writing to file:: /home/inttyl/data/fil8.js
ERROR : writing to the file :/home/inttyl/data/
Error: EISDIR: illegal operation on a directory, open '/home/inttyl/data/'
SUCCES writing to file:: /home/inttyl/data/fil8.js
SUCCES writing to file:: /home/inttyl/data/fil8.js
SUCCES writing to file:: /home/inttyl/data/fil8.js
SUCCES writing to file:: /home/inttyl/data/fil8.js
SUCCES writing to file:: /home/inttyl/data/fil8.js
SUCCES writing to file:: /home/inttyl/data/fil8.js
SUCCES writing to file:: /home/inttyl/data/fil8.js
SUCCES writing to file:: /home/inttyl/data/fil8.js
编辑
问题1解决了,因为在数据中,有一个fileName属性是无效的。
对于问题2,我更新跟踪,它总是打印最后一个文件名。你知道怎么解决这个问题吗?这是一个关闭的问题,但我不知道如何做。
问题1
看一下你的"处理"的最后一条消息。日志:
处理书面文件::/home/inttyl/数据/
它不包含像其他文件一样的文件:
正在处理写入文件::/home/inttyl/data/file1.js
所以进程试图写入dir
而不是file
,这就是Error: EISDIR
的原因
在这个函数中,您可能希望在处理之前确保currVal.fileName
是有效的。
let
或const
声明变量
。const fullPath = dataDirectory + currVal.fileName;
这确实是闭包/作用域的问题。您没有声明变量,即使使用var
,这使得它们在全局范围内设置。因此,对于循环中的每一步,您都将值赋给相同的变量。"以后","结束";对于第一个writefile,它将记录分配给fullPath
的最后一个值。
通过声明变量,每个循环现在都处理自己的一组变量。
提示:使用'use strict'
。它会强迫你声明变量