2016-09-30 87 views
1

我有一個場景,我正在執行到快速服務器的提取請求。快遞服務器然後執行對api api服務的提取請求。所以我讓客戶端等待解決的承諾,並且一旦服務器端的承諾在與rails api進行通信後解決,這個承諾就會解決。客戶端在服務器上等待承諾解決

並且在表達方面,一旦服務器上的承諾解決,我只會調用res.json()

這裏的服務器請求的樣子:

apiRouter.post('/login', (req, res) => { 
    const partnerId = 'id'; 
    const apikey = 'key'; 
    const apikeyIdentifier = 'id'; 
    const cerebroUrl = `http://${apikeyIdentifier}:${apikey}@localhost:3000/v1/${partnerId}/login`; 
    const data = { 
    //data 
    }; 

    httpRequest(cerebroUrl, httpMethods.post, data).then(response => { 
    res.json(response); 
    }).catch(error => { 
    console.log(error.response.status); 
    res.json(error.response); 
    }); 
}); 

和客戶端的請求:

const url = '/api/login'; 
const data = { username, password }; 
return httpRequest(url, httpMethods.post, data).then(response => { 
    console.log('success', response); 
    return response; 
}).catch(error => { 
    console.error('error', error); 
}); 

和我有檢查解決前狀態的一個輔助方法:

export const checkStatus = response => { 
    console.log(response.status); 
    console.log(response); 
    if (response.status >= 200 && response.status < 300) return response; 
    let error = new Error(response.statusText); 
    error.response = response; 
    throw error; 
}; 

奇怪的是,在checkStatus方法中,控制檯正在記錄200的響應狀態,但是在t他的客戶端request.then的響應有一個422.

我認爲最初的客戶端請求首先解析爲200,但當服務器承諾解決,我得到422時,客戶端已經過去了這一階段。或者...

有沒有辦法以更可預測的方式處理承諾?

這裏就是獲取請求函數看起來像:

export const httpRequest = (url, method, data) => { 
    return fetch(url, { 
    method, 
    headers: { 
     'Content-Type': 'application/json', 
     'Accept': 'application/json', 
    }, 
    body: JSON.stringify(data), 
    }) 
    .then(checkStatus) 
    .then(parseJSON) 
    .then(response => { 
    return response; 
    }); 
}; 

回答

0

調試我發現我必須手動設置狀態代碼在服務器端的承諾.catch

apiRouter.post('/login', (req, res) => { 
    const partnerId = 'id'; 
    const apikey = 'key'; 
    const apikeyIdentifier = 'id'; 
    const cerebroUrl = `http://${apikeyIdentifier}:${apikey}@localhost:3000/v1/${partnerId}/login`; 
    const data = { 
    //data 
    }; 

    httpRequest(cerebroUrl, httpMethods.post, data).then(response => { 
    res.json(response); 
    }).catch(error => { 
    console.log(error.response.status); 
    res.status(error.response.status); // <-- HERE --- 
    res.json(error.response); 
    }); 
}); 

否則後,它正在返回一個200,這很奇怪,因爲error.response是一個狀態爲422的對象,並且checkStatus函數會檢查它。也許我誤解表演時什麼是真正發回res.json()

它沒有任何意義,我雖然因爲手動設置狀態之前,我有以下陷阱:

.catch(error => { 
     res.json(error.response); 
    }); 

和2臺.logs:

export const checkStatus = response => { 
    console.log(response.status); 
    console.log(response); 

這些正在返回:

{... status:200,statusText:'OK'...}

和所有我至今變化是這樣的:

.catch(error => { 
    res.status(error.response.status); 
    res.json(error.response); 
}); 

,現在它記錄:

{...狀態:422,狀態文本:「我的自定義狀態文本'...}

我不'不明白爲什麼只改變res.status也會更新響應對象本身...