如何发送github上OAuth的数据到客户?
我需要实现一个GitHub的授权,后来接收到的数据(JSON)发送到客户端。
我发现这个教程/
在该教程开发商向我们展示了这种方式:“/” - >“/登录” - >“/重定向” - >“/用户”(这里的数据)
但我需要: “/” - > “/登录” - > “/重定向” - > “/”(这里的数据)
由于客户端应该使用简单的SPA(反应)。
我现在拥有的一切:
require('dotenv').config(); const express = require('express'); const app = express(); const session = require('express-session'); const request = require('request'); const qs = require('querystring'); const url = require('url'); const randomString = require('randomstring'); const csrfString = randomString.generate(); const port = process.env.PORT || 8080; const redirect_uri = process.env.HOST + '/redirect'; app.use(express.static('views')); app.use( session({ secret: randomString.generate(), cookie: { maxAge: 60000 }, resave: false, saveUninitialized: false }) ); app.get('/', (req, res, next) => { res.sendFile(__dirname + '/index.html'); if (req.session.access_token) { request.get( { url: '', headers: { Authorization: 'token ' + req.session.access_token, 'User-Agent': 'Login-App' } }, (error, response, body) => { res.send(body); } ); } }); app.listen(port, () => { console.log('Server listening at port ' + port); }); app.get('/login', (req, res, next) => { req.session.csrf_string = randomString.generate(); const githubAuthUrl = '?' + qs.stringify({ client_id: process.env.CLIENT_ID, redirect_uri: redirect_uri, state: req.session.csrf_string, scope: 'user:email' }); res.redirect(githubAuthUrl); }); app.all('/redirect', (req, res) => { console.log('Request sent by GitHub: '); console.log(req.query); const code = req.query.code; const returnedState = req.query.state; if (req.session.csrf_string === returnedState) { request.post( { url: '?' + qs.stringify({ client_id: process.env.CLIENT_ID, client_secret: process.env.CLIENT_SECRET, code: code, redirect_uri: redirect_uri, state: req.session.csrf_string }) }, (error, response, body) => { console.log('Your Access Token: '); console.log(qs.parse(body)); req.session.access_token = qs.parse(body).access_token; res.redirect('/'); } ); } else { res.redirect('/'); } console.log(redirect_uri); });
在这一刻res.send(身体);抛出一个错误
app.get('/', (req, res, next) => { res.sendFile(__dirname + '/index.html'); if (req.session.access_token) { request.get( { url: '', headers: { Authorization: 'token ' + req.session.access_token, 'User-Agent': 'Login-App' } }, (error, response, body) => { res.send(body); } ); } });
错误:
throw new ERR_HTTP_HEADERS_SENT('set'); ^ Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
这是因为我试图渲染之后渲染设置数据。
所以,我的问题:
我怎样才能将数据发送到客户端,以及如何得到它的客户端?
回答如下:HTTP使用需要每一个请求响应周期。当客户端发送一个请求,服务器应只发送一个响应返回给客户端。
您正在发送两个响应res.sendFile()
&res.send()
的一个要求,所以需要你的代码如下改变,
app.get('/', (req, res, next) => {
if (req.session.access_token) {
request.get({
url: 'https://api.github/user',
headers: { Authorization: 'token ' + req.session.access_token, 'User-Agent': 'Login-App' }
}, (error, response, body) => { res.send(body); }
);
} else {
res.sendFile(__dirname + '/index.html');
}
});