Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript reduce中的fs.writeFile与fetch存在问题_Javascript_Node.js_Async Await_Fetch_Reduce - Fatal编程技术网

Javascript reduce中的fs.writeFile与fetch存在问题

Javascript reduce中的fs.writeFile与fetch存在问题,javascript,node.js,async-await,fetch,reduce,Javascript,Node.js,Async Await,Fetch,Reduce,我需要一些关于我正在写作的助手的帮助。由于某种原因,在读取文件的异步中使用reduce时,当尝试将结果写入文件时,它不会前进到数组的下一项。但是,如果我使用console.log,它就可以正常工作 const neatCsv = require('neat-csv'); const fetch = require('node-fetch'); const fs = require('fs'); fs.readFile('./codes.csv', async (err, data) =>

我需要一些关于我正在写作的助手的帮助。由于某种原因,在读取文件的异步中使用reduce时,当尝试将结果写入文件时,它不会前进到数组的下一项。但是,如果我使用console.log,它就可以正常工作

const neatCsv = require('neat-csv');
const fetch = require('node-fetch');
const fs = require('fs');

fs.readFile('./codes.csv', async (err, data) => {
    if (err) { throw err; }

    let baseUrl = 'https://hostname/orders?from=2019-10-21T00:00:00.001Z&to=2019-12-31T23:59:59.000Z&promo=';
    const starterPromise = Promise.resolve(null);
    const promos = await neatCsv(data);
    const logger = (item, result) => console.log(item, result);

    function write (item, result) {
        return new Promise((resolve, reject) => {
            fs.writeFile(`./output/${item.PROMO}.json`, JSON.stringify(result), (err) => {
                if (err) { throw err; }
                console.log(`Wrote file ${item.PROMO}`);
            });
        })
    }

    function asyncFetch(item) {
        console.log(`runTask <---------${item.PROMO}---------`);
        return fetch(`${baseUrl}${item.PROMO}`, { headers: { 'x-apikey': 'xyz' }})
            .then(res => (res.json())
            .then(json => json))
    }

    await promos.reduce(
        (p, item) => p.then(() => asyncFetch(item).then(result => write(item, result))),
        starterPromise
    )
});
我们的目标是迭代这些,进行REST调用以获得json结果,并将这些结果写入具有当前promo名称的文件,然后移动到下一个文件,进行新调用并将其保存到不同的文件及其各自的代码中


在reduce中,如果调用logger而不是write,那么它可以正常工作。调用write,它只是一遍又一遍地进行相同的调用,并覆盖同一个文件,迫使我杀死它。请帮帮我,我在这里疯了…

您可能会在任何地方使用
async
函数,而
fs
承诺使用API和简单的while循环来使用CSV项目。干编码,自然,因为我没有你的CSV或API

(您最初的问题可能是由于您没有在
write
函数中
解决
/
拒绝
,但也不需要reduce hell…)

const neatCsv=require(“整洁csv”);
const fetch=require(“节点获取”);
const fsp=要求(“fs”)承诺;
const logger=(项,结果)=>console.log(项,结果);
常量baseUrl=”https://hostname/orders?from=2019-10-21T00:00:00.001Z&to=2019-12-31T23:59:59.000Z&promo=“;
异步函数asyncFetch(项){
console.log(`runTask{
console.log(“完成!”);
});

使用模拟数据和JSON占位符服务的版本运行良好:

const fetch=require(“节点提取”);
const fsp=要求(“fs”)承诺;
常量baseUrl=”https://jsonplaceholder.typicode.com/comments/";
异步函数asyncFetch(项){
console.log(`runTask{
console.log(“完成!”);
});

不幸的是,这也发生了同样的事情。我认为这是一个竞争条件。用我的api尝试你的代码,它也会发生同样的事情。当我用模拟服务()尝试它时,它会起作用。只要确保你删除${item.PROMO}我不能准确地分享api的安全细节,希望你能理解。不过这很有帮助。有趣的是,它从未真正完成,只是在promos数组的长度上不断循环。如果它与mock一起工作,你确定你调用的服务正确吗?100%正确。它写入了第一个文件和响应就在那里。也许是我的响应的大小?我添加了另一个版本(使用硬编码的“CSV”)还有模拟服务——我真的不知道该告诉你什么,它工作得很好。你在哪个平台上,哪个节点版本?谢谢。我现在在v10.15.3上。我发现了问题,我让nodemon运行以在保存时重新运行。writeFile触发了一个保存,导致重新加载脚本…愚蠢。我的原始脚本工作得很好很有趣,它在一些writeFile场景中工作。无论如何,再次感谢你的帮助!
PROMO
12345
56789
98765
...
const neatCsv = require("neat-csv");
const fetch = require("node-fetch");
const fsp = require("fs").promises;

const logger = (item, result) => console.log(item, result);

const baseUrl = "https://hostname/orders?from=2019-10-21T00:00:00.001Z&to=2019-12-31T23:59:59.000Z&promo=";

async function asyncFetch(item) {
  console.log(`runTask <---------${item.PROMO}---------`);
  const res = await fetch(`${baseUrl}${item.PROMO}`, { headers: { "x-apikey": "xyz" } });
  const json = await res.json();
  return json;
}

async function write(item, result) {
  await fsp.writeFile(`./output/${item.PROMO}.json`, JSON.stringify(result));
  console.log(`Wrote file ${item.PROMO}`);
}

async function process() {
  const data = await fsp.readFile("./codes.csv");
  const promos = await neatCsv(data);
  while (promos.length) {
    const item = promos.shift();
    const result = await asyncFetch(item);
    await write(item, result);
  }
}

process().then(() => {
  console.log("done!");
});