【发布时间】:2018-10-30 20:40:59
【问题描述】:
我正在尝试创建一个进行 2 个 API 调用的路由,第二个取决于第一个的结果,并且只有在满足某些条件时才需要调用。以下是我遇到的问题。
- 不管怎样,finalCheck 函数似乎在 forEach 之前被调用?即使包裹在 if 语句中
- 计数器和 userNamesAvailable 在范围之外不可用 他们被分配进来。
-
我确信有更好的方法可以做到这一点,并且会喜欢任何相关的 建议。
router.post('/namecheck', async function(req, res, next) { var name = req.body.name; var counter = 0 var domains = [] var userNamesAvailable = [] var dotcom = true var answer = '' getDomains(checkDomains) // Check domain availabilty function getDomains (callback) { var url='https://api.ote-godaddy.com/v1/domains/available?checkType=FAST' Unirest.post(url) .headers({ "Authorization" : "sso-key ", "Content-Type": "application/json" }) .send( [ name + '.com', name + '.net', name + '.org' ] ) .end(function(response) { domains=response.body.domains console.log(domains) callback(domains) }) } function checkDomains(domains) { var d = 0 //If no data is returned send error if(!domains) { console.log("No data returned") return next("No data returned") } else { //Check how many domains are unavailable for(var i=0; i < domains.length; i++) { if(domains[i].available == false){ d = d + 1 //Flag if the .com is available if(domains[i].domain == name + '.com') { dotcom = false } } } if (d >2) { console.log("d is greater than 1") answer = 'no' //If 2 domains are available and one is .com continue } else if (d>1 && dotcom =='false') { answer = 'no' } } getUsernames(finalCheck) } function getUsernames(callback){ // Social Sites to Check var sitenames = [ 'facebook', 'twitter', 'instagram', 'youtube', 'slack', 'blogger' ] // Check Usename availabitliy let i = 0 sitenames.forEach(sitename => { Unirest.post('https://api.namechk.com/services/check.json') .headers({ 'AUTHORIZATION': 'Bearer ', 'Accept': 'application/vnd.api.v1+json', }).send({ 'site': sitename, username: name, }).end(function(response) { if(response.body.available == false){ counter ++ } else { userNamesAvailable.push(response.body) } }); i++ }); console.log(counter) console.log(userNamesAvailable) if(i == sitenames.length){ callback(counter, dotcom) } } function finalCheck(counter, dotcom) { console.log('Start finalCheck') console.log(counter) console.log(dotcom) //Final Check for is a name is a go or not //If one social site is not available and the if(counter == 1 && dotcom =='true') { console.log(5-counter + ' social sites available') res.send("yes"); } else { res.send("no") } } })
【问题讨论】:
-
我不知道这是否是问题,但您有
d > 1 & dotcom == 'false',也许您的意思是d > 1 && dotcom == false(即,将 & 更改为 && 并将 'false' 更改为 false)。 finalCheck 的更改相同。 -
getUsernames上的回调发生在forEach之前,因为每个元素都会创建一个异步调用。在调用回调之前,您需要观察 所有 请求结束。 -
谢谢我确实抓住了这个条件,但它不会影响其他代码。我知道为什么会调用 getUsernames 但不确定如何正确构建它。
标签: javascript node.js api express callback