Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.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 节点js连续API调用未执行_Javascript_Node.js_Api_Express_Node Fetch - Fatal编程技术网

Javascript 节点js连续API调用未执行

Javascript 节点js连续API调用未执行,javascript,node.js,api,express,node-fetch,Javascript,Node.js,Api,Express,Node Fetch,我正在为一个课程的项目工作,我需要将多个API调用链接在一起。当前,第一个API调用函数中的所有内容都会在终端中执行和显示,但第一个API调用后的所有内容都不会执行任何操作。我在表单中获取用户输入的位置和日期。第一个API调用起作用。它将位置转换为纬度和经度,然后将日期(MM/DD/YYYY)分为三个变量:月、日期和年,并将它们存储在projectData对象中,然后我需要使用该对象进行第二次API调用。问题是,在第一个API调用函数执行并将所有内容存储到projectData对象之后,之后的所

我正在为一个课程的项目工作,我需要将多个API调用链接在一起。当前,第一个API调用函数中的所有内容都会在终端中执行和显示,但第一个API调用后的所有内容都不会执行任何操作。我在表单中获取用户输入的位置和日期。第一个API调用起作用。它将位置转换为纬度和经度,然后将日期(MM/DD/YYYY)分为三个变量:月、日期和年,并将它们存储在projectData对象中,然后我需要使用该对象进行第二次API调用。问题是,在第一个API调用函数执行并将所有内容存储到projectData对象之后,之后的所有内容都不起任何作用。我尝试使用第一个API调用中存储的所有信息记录新的projectData对象,但在终端中没有看到它被记录。然后我尝试从projectData中提取新存储的数据,并在第二个API调用函数中使用它,但它什么也不做。以下是相关代码:

GEONAMES_API = process.env.GEONAMES_ID
darksky_key = process.env.DARKSKY_KEY
console.log(darksky_key)
console.log(GEONAMES_API);
projectData = {one: {coord: {lat: '', lng: ''}, date: ''}, two: {month: '', day: '', year: ''}, three: {}};
place = {}; 

app.post('/postData', getData);

function getData(req, res){
    console.log(req.body.data);
    place = req.body.data.place;
    date = req.body.data.date;
    projectData.one.date = date;
    console.log(projectData)
    console.log(date)
    console.log(place)
    geonames(place, GEONAMES_API)
    console.log(projectData)
    lat = projectData.one.coord.lat;
    lng = projectData.one.coord.lng;
    month = projectData.two.month;
    day = projectData.two.day;
    year = projectData.two.year;
    darkskyFetch(lat, lng, month, day, year, darksky_key)
地理名称功能:

function geonames(place, id){
    fetch(`http://api.geonames.org/searchJSON?name=${place}&username=${id}`)
    .then(response => response.json())
    .then(data => {
        console.log(data)
        lng = data.geonames[1].lng
        lat = data.geonames[1].lat
        console.log(lng)
        console.log(lat)
        projectData.one.coord.lat = lat;
        projectData.one.coord.lng = lng;
        console.log(projectData)
        console.log(projectData)
        lat = projectData.one.coord.lat;
        lng = projectData.one.coord.lng;
        date = projectData.one.date;
        console.log(lat)
        console.log(lng)
        date_split = date.split("/")
        console.log(date_split)
        month = date_split[0]
        day = date_split[1]
        year = date_split[2]
        console.log(month)
        console.log(day)
        console.log(year)
        projectData.two.month = month;
        projectData.two.day = day;
        projectData.two.year = year;
        console.log(projectData)
    })
    .catch(error => error)

}
function darkskyFetch(lat, lng, month, day, year, darksky_key){
    fetch(`https://api.darksky.net/forecast/${darksky_key}/${lat},${lng},${year}-${month}-${day}`)
    .then(response => response.json())
    .then(data => {
        console.log(data)
    })
    .catch(error => eerror)
}
darkskyFetch函数:

function geonames(place, id){
    fetch(`http://api.geonames.org/searchJSON?name=${place}&username=${id}`)
    .then(response => response.json())
    .then(data => {
        console.log(data)
        lng = data.geonames[1].lng
        lat = data.geonames[1].lat
        console.log(lng)
        console.log(lat)
        projectData.one.coord.lat = lat;
        projectData.one.coord.lng = lng;
        console.log(projectData)
        console.log(projectData)
        lat = projectData.one.coord.lat;
        lng = projectData.one.coord.lng;
        date = projectData.one.date;
        console.log(lat)
        console.log(lng)
        date_split = date.split("/")
        console.log(date_split)
        month = date_split[0]
        day = date_split[1]
        year = date_split[2]
        console.log(month)
        console.log(day)
        console.log(year)
        projectData.two.month = month;
        projectData.two.day = day;
        projectData.two.year = year;
        console.log(projectData)
    })
    .catch(error => error)

}
function darkskyFetch(lat, lng, month, day, year, darksky_key){
    fetch(`https://api.darksky.net/forecast/${darksky_key}/${lat},${lng},${year}-${month}-${day}`)
    .then(response => response.json())
    .then(data => {
        console.log(data)
    })
    .catch(error => eerror)
}
如何执行geonames函数之后的所有代码

非常感谢,
Michael

如果您想知道
然后
回调何时在
geonames
中执行,那么请确保返回承诺,并在调用后链接一个
然后

因此在
geonames
中:

   return fetch( .....
// ^^^^^^
它的名称是:

geonames(place, GEONAMES_API).then(() => {
    // all code that needs to execute after the geonames promise resolves
});
一些评论:

  • 然后
    回调中变异全局变量不是一个好的做法。相反,让该
    回调返回任何新的/计算出的值。这将成为提供给
    geonames()的回调中的解析值。然后

  • 使用
    async
    wait
    时,语法会变得更简单。所以你可能也想调查一下


这很有效。我走了异步等待路线,现在我可以在第一次API调用之后做一些事情。