【问题标题】:Nodejs file writing strange behavior and variable value issueNodejs文件写入奇怪的行为和变量值问题
【发布时间】:2016-09-14 14:57:05
【问题描述】:

我对以下代码有 2 个问题,我为保存某些 REST 服务返回的 JSON 数据而编写的代码

问题 1

在将某些 REST 服务返回的数据写入文件之前,我遇到了一个问题。 问题不在于调用其余服务并获取数据。但就在它写入目录之前

当我调用该函数时,在跟踪中有一个错误“错误:EISDIR:对目录的非法操作,打开'/home/inttyl/data/'”

文件都正确保存在目录中 我不明白为什么会出现错误。

问题 2

第二个问题是输出,

我期待整个路径+文件名

成功写入文件:: /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解决了,我不好,因为在数据中,有一个文件名属性是无效的。

对于问题 2,我更新了跟踪,它总是打印最后一个文件名。你知道如何解决它吗?这是关闭的问题,但我不知道该怎么做。

【问题讨论】:

  • 问题不在于给出的代码,而是currVal 给出的输入似乎是错误的。
  • services 数组中是否有 ... 文件名条目或具有空白文件名的条目?我建议您显示服务数组的console.log()
  • @Sirko,确实在我的数据中,有一个文件名为空的条目!!!
  • @jfriend00 ,谢谢,我的错,数据缺少文件名!

标签: node.js file


【解决方案1】:

问题 1

查看“处理”日志的最后一条消息:

处理写入文件:: /home/inttyl/data/

它不像其他文件那样包含文件:

处理写入文件:: /home/inttyl/data/file1.js

所以进程试图写入dir而不是file,这就是Error: EISDIR的原因

在此函数中,您可能希望在处理之前确保currVal.fileName 有效。

问题 2

使用letconst 声明您的变量。

例如const fullPath = dataDirectory + currVal.fileName;

这确实是一个闭包/范围的问题。即使使用var,您也没有声明变量,这使得它们被设置在全局范围内。因此,对于循环中的每一步,您都将值分配给同一个变量。 “稍后”,在第一个 writefile 的“完成”处,它将记录分配给 fullPath 的最后一个值。

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

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

【讨论】:

  • 确实我的数组中一个条目的 filnename 属性无效
  • @inttyl 是的,我认为会是这样。
  • thansk,对问题 2 有一个想法,我更新了跟踪,它总是打印最后一个文件名
  • @inttyl 您正在使用的 Node.js 版本是什么?
  • @inttyl 用letconst 声明你的变量。例如const fullPath = dataDirectory + currVal.fileName;
猜你喜欢
  • 1970-01-01
  • 2013-11-27
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 2015-04-01
  • 2016-06-01
相关资源
最近更新 更多