Nodejs文件写奇怪的行为和变量值问题



我对下面的代码有两个问题,我写的代码是为了保存一些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是有效的。

<标题>问题2 h1> letconst声明变量

const fullPath = dataDirectory + currVal.fileName;

这确实是闭包/作用域的问题。您没有声明变量,即使使用var,这使得它们在全局范围内设置。因此,对于循环中的每一步,您都将值赋给相同的变量。"以后","结束";对于第一个writefile,它将记录分配给fullPath的最后一个值。

通过声明变量,每个循环现在都处理自己的一组变量。

提示:使用'use strict'。它会强迫你声明变量

最新更新