请求未返回正确值的Javascript函数

请求未返回正确值的Javascript函数,javascript,node.js,request,Javascript,Node.js,Request,我现在正在使用请求节点包制作一个节点应用程序,以连接到API。但是,当我发出API请求时,用于确定用户名和密码有效性的函数不会按预期返回true 以下是我目前的代码: const request = require("request") const API_URL = <the_api_url> const isValidLogin = (username, password) => { let success = false; let options = {

我现在正在使用
请求
节点包制作一个节点应用程序,以连接到API。但是,当我发出API请求时,用于确定
用户名
密码
有效性的函数不会按预期返回
true

以下是我目前的代码:

const request = require("request")
const API_URL = <the_api_url>

const isValidLogin = (username, password) => {
    let success = false;
    let options = {
        url: API_URL,
        method: 'GET',
        auth: {
            user: username,
            pass: password
        }
    }
    request(options, (error, response, body) => {
        console.log(response.statusCode);
        if (error) {
            console.log(error)
        }
        if (response.statusCode == 200) {
            success = true;
        }
        else {
            success = false
        }
    })
    console.log(success)
    return success;
}
const request=require(“请求”)
常量API_URL=
常量isValidLogin=(用户名、密码)=>{
让成功=虚假;
让选项={
url:API_url,
方法:“GET”,
认证:{
用户:用户名,
密码
}
}
请求(选项,(错误、响应、正文)=>{
console.log(响应.状态码);
如果(错误){
console.log(错误)
}
如果(response.statusCode==200){
成功=真实;
}
否则{
成功=错误
}
})
console.log(成功)
回归成功;
}
当我将无效的
用户名
密码
传递到
isValidLogin()
时,它正确地返回false。我注意到
响应。statusCode
200
,这意味着
success
true
,但是它没有按预期工作。
request()
函数是异步的,这基本上意味着
request()
函数调用的结果将在将来返回。对于此
request()
方法,结果将在将来通过回调返回(即您正在测试
statusCode

要根据对
request()
的调用正确返回
success
结果,您需要执行以下两项操作之一:

  • isValidLogin()
    定义为异步函数/返回将来解决的承诺:
  • 或者,将回调传递给
    isValidLogin
    ,在
    request()完成后,通过
    success
    结果调用该回调:

  • request
    是异步的-因此,在回调中填充它之前,您将返回
    success
        /* Add asnyc means this function is now asynchronous */
        const isValidLogin = async (username, password) => {
            let success = false;
            let options = {
                url: API_URL,
                method: 'GET',
                auth: {
                    user: username,
                    pass: password
                }
            }
    
            /* return the result of the request when the request
            has completed */
            return await (new Promise(resolve, reject) => {
                request(options, (error, response, body) => {
    
                    if (response.statusCode == 200) {
                        resolve(true);
                    }
                    else {
                        resolve(false);
                    }
                });
            });
        }
    
        /* Requires the surrounding function to be async */
        const success = await isValidLogin('john', 'password');
    
    
    
        /* onComplete is the added callback that is fired when request() completes */
        const isValidLogin = (username, password, onComplete) => {
            let success = false;
            let options = {
                url: API_URL,
                method: 'GET',
                auth: {
                    user: username,
                    pass: password
                }
            }
            request(options, (error, response, body) => {
                console.log(response.statusCode);
                if (error) {
                    console.log(error)
                }
                if (response.statusCode == 200) {
                    onComplete(true);
                }
                else {
                    onComplete(false)
                }
            });
        }
    
        /* Usage example */
        isValidLogin('john', 'password', (success) => {
            console.log(`the request completed in the future 
                         and the result was ${success}`)
        })