Node.JS:写入文件时,Promise 产生 null

Posted

技术标签:

【中文标题】Node.JS:写入文件时,Promise 产生 null【英文标题】:Node.JS: Promise yields to null when writing to the file 【发布时间】:2018-01-07 06:18:23 【问题描述】:

我一直在研究一个问题,但我似乎无法完全理解其起源。 我的应用程序的工作流程是这样的:

    为单个请求获取一组项目 对该数组的每个项目发出单独的请求:Promise.all(array.map(individualRequest)) 从每个请求中获取信息并将其更改为特定布局 将数组中所有项的修改信息记录到一个JSON文件中

直到第 4 步,一切似乎都在无缝运行。在第 3 步中,我正确修改了对象,但是当它返回到 main 时(每个步骤都有一个专用模块),第 4 步写道:[null,null,null...](原始中的每个项目都为 null数组)在 JSON 文件中。

我不确定如何将其放入代码中并使其变得简单(不发布整个原始代码),但您可以在此处找到完整版本: https://github.com/Ardzii/mongoNode

我知道项目信息正在被正确转换,因为我在转换模块中留下了一个控制台日志进行验证,它给了我正确的信息:

[添加]: "name":"DASHEUR","a":["151.400000","1","1.000"],"b":["148.500000","1","1.000"],"c":[ "151.577960","0.01000000"],"v":["1861.79012466","3063.32653118"],"p":["151.527639","150.811326"],"t":[688,1205],"l" :["146.599930","146.599930"],"h":["156.118780","156.118780"],"o":"148.000000"

我不知道为什么,当它回到主 (app.js) 时:

async function worker() 
      var tickerList = await getTickerList();
      var tickerInfo = await getTickerInfo(tickerList);
      var filename = `./modules/batches/$new Date().toISOString()batch.json`;

      fs.writeFile(filename, JSON.stringify(tickerInfo), (err) => 
          if (err) throw err;
          console.log("[SUCCESS]: All tickers processed successfully!");
      );
  

  worker();

我觉得很糟糕

[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,空,空]

存储在 JSON 文件中...(同样,数组中的每个项目都有一个“null”)

提前感谢您的帮助,我希望我能够保持清晰和简单!

【问题讨论】:

如果没有看到您的 getTickerInfo()getTickerList() 函数的作用,就不可能说出问题所在。显然,getTickerInfo() 解析为一个充满null 的数组 您是否意识到if (err) throw err; 在异步回调中不是合理的错误处理? 嘿jfriend00!一点也不...我完全是初学者,所以如果你有更好的方法和一些材料来对此进行适当的跟进,我会很高兴 【参考方案1】:

modules/transformTicker.js, line 22

function transformTicker(ticker) 
  var result = ;
  Object.keys(ticker).forEach((k) => 
    // Object.keys(ticker[pair]).forEach((k) => 
      // console.log(k);
      result= 
        name: k,
        a: ticker[k].a,
        b: ticker[k].b,
        c: ticker[k].c,
        v: ticker[k].v,
        p: ticker[k].p,
        t: ticker[k].t,
        l: ticker[k].l,
        h: ticker[k].h,
        o: ticker[k].o,
      
      console.log(`[ADDED]: $JSON.stringify(result)`);
      return result;
    // );
  );

您的“return”语句在 forEach 函数范围内,而它应该在外部,在 for-each 循环之后。

修正版:

function transformTicker(ticker) 
  var result = ;
  Object.keys(ticker).forEach((k) => 
    // Object.keys(ticker[pair]).forEach((k) => 
      // console.log(k);
      result= 
        name: k,
        a: ticker[k].a,
        b: ticker[k].b,
        c: ticker[k].c,
        v: ticker[k].v,
        p: ticker[k].p,
        t: ticker[k].t,
        l: ticker[k].l,
        h: ticker[k].h,
        o: ticker[k].o,
      
      console.log(`[ADDED]: $JSON.stringify(result)`);
    // );
  );
  return result;

【讨论】:

嘿!谢谢,让我几个小时再回来检查一下! 这确实是我的问题!现在一切都按预期工作!非常感谢

以上是关于Node.JS:写入文件时,Promise 产生 null的主要内容,如果未能解决你的问题,请参考以下文章

Promise--实践练习之fs模块 & node运行Js脚本 & Promise封装练习-fs模块 & util.promisify方法

在 Node.js 中事务性地写入文件

使用 Q 在 Node.js 中同步 Promise 的麻烦

使用 Node.js 将对象写入文件

使用 Node.js 将对象写入文件

如何在 Node.js 流回调中聚合从异步函数生成的 Promise?