Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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 Axios.all-in-NodeJS失败,出现404错误_Javascript_Node.js_Mongodb_Express_Axios - Fatal编程技术网

Javascript Axios.all-in-NodeJS失败,出现404错误

Javascript Axios.all-in-NodeJS失败,出现404错误,javascript,node.js,mongodb,express,axios,Javascript,Node.js,Mongodb,Express,Axios,我希望你能帮助我,因为要解决这个问题需要几个小时。我在谷歌上搜索了这么多,尝试了我找到的所有解决方案,但我总是得到同样的错误。 我试图让axis获得对API的请求,该API为每页1个结果分页,循环遍历所有结果,并使用promise数组解析Promission。 我已经验证了,没有循环,只要得到一个请求,一切都正常。我已经使用MongoDB驱动程序成功地编写了MongoDB,而且很好。一旦我引入循环,我就无法得到要解决的承诺。我能够console.log证明promise数组中确实有x个待定承诺

我希望你能帮助我,因为要解决这个问题需要几个小时。我在谷歌上搜索了这么多,尝试了我找到的所有解决方案,但我总是得到同样的错误。 我试图让axis获得对API的请求,该API为每页1个结果分页,循环遍历所有结果,并使用promise数组解析Promission。 我已经验证了,没有循环,只要得到一个请求,一切都正常。我已经使用MongoDB驱动程序成功地编写了MongoDB,而且很好。一旦我引入循环,我就无法得到要解决的承诺。我能够console.log证明promise数组中确实有x个待定承诺

const MongoClient = require('mongodb')
const axios = require('axios');
const url = 'https://catfact.ninja/fact'

let db = null;
let client = null;

//this one works great
const getMetaData = function () {  
    let data = axios.get(url+"s")
    .then(response => {
        return response.data
    }).catch(error => console.log(error));
   return data;
}
//this one will not resolve
const dataArray =  async function (total) {
    let baseUrl = url+"s/facts?page="
    let res =[];    
    let promises = [];
    for (let page = 1; page <= total; page++){
        promises.push(axios.get(baseUrl+page))
    }
    axios.all(promises).then(result => console.log(result))
   //originally i wanted to map the result to an array of json
  //objects, but if i could even get a console.log it would be
 //a win. spread operator not working, Promise.all not working
 //i must have tried 12 different stackoverflow responses from
//other questions. until i can resolve the promises I can't do anything.


    }








exports.connect = async function(url, done) {
    if (db) return done();

   // let data = await getMetaData()
   // let total = data['total']
    let arr = dataArray(5);


    //console.log("arr is "+arr)
    MongoClient.connect(url, {useNewUrlParser: true}, function (err, client){
        if (err) return done(err);
        client = client;
        db = client.db('morefun');    
        /*
        db.collection('catfacts').insertMany(dataArray, function(err, res){
            if (err) throw err;
            console.log("Inserted: " + res.insertedCount);
        })*/
        done();


    });


}

exports.get = function() {
    return db;
}

//make sure this is correct
exports.close = function(done) {
    if (db) {
        client.close(function(err, result) {
            db = null;
            mode = null;
            done(err);
        });
    }
}
const MongoClient=require('mongodb'))
const axios=require('axios');
常量url=https://catfact.ninja/fact'
设db=null;
让client=null;
//这个很好用
const getMetaData=function(){
让data=axios.get(url+“s”)
。然后(响应=>{
返回响应.data
}).catch(错误=>console.log(错误));
返回数据;
}
//这个问题解决不了
常量数据数组=异步函数(总计){
让baseUrl=url+“s/facts?页面=”
设res=[];
让承诺=[];
for(让page=1;page console.log(结果))
//最初我想将结果映射到一个json数组
//对象,但如果我能得到一个console.log
//赢了。传播操作员不工作,承诺。全部不工作
//我一定尝试了12种不同的stackoverflow响应
//其他问题。在我能解决承诺之前,我什么都不能做。
}
exports.connect=异步函数(url,完成){
if(db)返回done();
//让数据=等待getMetaData()
//让总数=数据['total']
设arr=dataArray(5);
//控制台日志(“arr为”+arr)
connect(url,{useNewUrlParser:true},函数(err,客户端){
如果(错误)返回完成(错误);
客户=客户;
db=client.db('morefun');
/*
db.collection('catfacts').insertMany(数据数组,函数(err,res){
如果(错误)抛出错误;
日志(“插入:+res.insertedCount”);
})*/
完成();
});
}
exports.get=函数(){
返回分贝;
}
//确保这是正确的
exports.close=函数(完成){
中频(db){
client.close(函数(错误、结果){
db=null;
模式=空;
完成(错误);
});
}
}

我需要一个JSON对象数组,insertMany函数才能工作。请有人帮帮我。我做错了什么

不确定这是否是答案,但我知道如果没有使用axios想要的语法,我会遇到问题

axios.all([fetch1request(),fetch2request()])。然后(axios.spread((fetch1,fetch2)=>*您需要的任何逻辑。但此时请求已完成*)

在for循环中,您创建的URL如下:
https://catfact.ninja/facts/facts?page=1
–这是不正确的,正确的URL应该是
https://catfact.ninja/facts?page=1
(事实仅一次)

此外,这里不需要关键字
async
,您应该返回
axios.all的结果

代码的正确版本:

const dataArray = function (total) {
  let baseUrl = url+"s?page="
  let res =[];    
  let promises = [];
  for (let page = 1; page <= total; page++){
    promises.push(axios.get(baseUrl+page))
  }
  return axios.all(promises).then(result => {
    console.log(result);
    return result;
  });
}
以您想要的方式获取实际数据

从您的评论中,我看到您真正想要的是对从API获得的数据进行后处理,最终得到一个只包含cat数据的数组

您可以通过使用和“按摩”数据来做到这一点,如下所示:

let arr = await dataArray(5);
return axios
    .all(promises)
    .then(result => result.map(({ data }) => data.data).reduce((curr, acc) => acc.concat(curr), []));
注意:为了简洁起见,我省略了console.log语句

  • 实际数据作为属性“数据”嵌套在对象内的对象中,因此映射调用检索该属性
  • 我们得到一个数组数组,每个数组都有一个包含cat数据的对象;reduce调用将其展平为一个简单的cat数据数组

我们得到的结果是这样的,希望这就是你想要的,非常感谢你……这是15个小时编码后发生的事情。我真的需要睡觉了……用你的代码更新后,我可以解决承诺,但数据包括我不想要的头,我想要的数据嵌套在一个数据中:[数组]你知道如何取出数组并去掉标题吗?对于一个get请求,我只使用了response.data,但它不符合承诺。所有语法。它没有定义…谢谢!!添加了答案,你没有指定你的数据的确切外观。如果这不正是你需要的,希望它能告诉你他正确的方向你是了不起的Patrick。你不仅知道自己在做什么,还知道如何理解那些无法表达的行尸走肉程序员的想法!非常感谢你。你给了我我所需要的东西!!感谢你帮助Jacob。这对了解axios如何实际推荐使用非常有帮助。所有