2017-03-05 71 views
0

使用body-parser + expressjs可以。但我的問題是:我如何獲得Hapijs中原始請求體的緩衝區?如何獲取Hapijs中原始請求正文的緩衝區?

我說話就像是在身體解析器NPM包此功能的buf PARAM事情:verify(req,res, buf, encoding)

我需要這個功能messenger-platform-samples例如:

function verifyRequestSignature(req, res, buf) { 
    var signature = req.headers["x-hub-signature"]; 
    if (!signature) { 
    console.error("Couldn't validate the signature."); 
    } else { 
    var elements = signature.split('='); 
    var method = elements[0]; 
    var signatureHash = elements[1]; 
    var expectedHash = crypto.createHmac('sha1', APP_SECRET) 
          .update(buf) 
          .digest('hex'); 
    if (signatureHash != expectedHash) { 
     throw new Error("Couldn't validate the request signature."); 
    } 
    } 
} 

編輯: 我需要使用server.ext()使用這在我的中間件,像這樣:

回答

4

[email protected]

這是你可以得到原始緩衝區和原標題:

'use strict'; 

const Hapi = require('hapi'); 

const server = new Hapi.Server(); 
server.connection({ 
    host: 'localhost', 
    port: 8000 
}); 

server.route({ 
    method: 'POST', 
    path:'/', 
    handler: function (request, reply) { 
     console.log(request.payload); 
     console.log(request.raw.req.headers); 
     return reply('hello world'); 
    }, 
    config: { 
     payload: { 
      output: 'data', 
      parse: false 
     } 
    } 
}); 

server.start((err) => { 
    if (err) throw err; 
    console.log('Server running at:', server.info.uri); 
}); 

運行例如:

$ curl -X POST 'http://localhost:8000/' -d name=nehaljwani --trace-ascii /dev/stdout 
Note: Unnecessary use of -X or --request, POST is already inferred. 
== Info: Trying 127.0.0.1... 
== Info: TCP_NODELAY set 
== Info: Connected to localhost (127.0.0.1) port 8000 (#0) 
=> Send header, 148 bytes (0x94) 
0000: POST/HTTP/1.1 
0011: Host: localhost:8000 
0027: User-Agent: curl/7.51.0 
0040: Accept: */* 
004d: Content-Length: 15 
0061: Content-Type: application/x-www-form-urlencoded 
0092: 
=> Send data, 15 bytes (0xf) 
0000: name=nehaljwani 
== Info: upload completely sent off: 15 out of 15 bytes 
<= Recv header, 17 bytes (0x11) 
0000: HTTP/1.1 200 OK 
<= Recv header, 40 bytes (0x28) 
0000: content-type: text/html; charset=utf-8 
<= Recv header, 25 bytes (0x19) 
0000: cache-control: no-cache 
<= Recv header, 20 bytes (0x14) 
0000: content-length: 11 
<= Recv header, 23 bytes (0x17) 
0000: vary: accept-encoding 
<= Recv header, 37 bytes (0x25) 
0000: Date: Sun, 05 Mar 2017 07:51:14 GMT 
<= Recv header, 24 bytes (0x18) 
0000: Connection: keep-alive 
<= Recv header, 2 bytes (0x2) 
0000: 
<= Recv data, 11 bytes (0xb) 
0000: hello world 
== Info: Curl_http_done: called premature == 0 
== Info: Connection #0 to host localhost left intact 
hello world 

服務器輸出:

Server running at: http://localhost:8000 
<Buffer 6e 61 6d 65 3d 6e 65 68 61 6c 6a 77 61 6e 69> 
{ host: 'localhost:8000', 
    'user-agent': 'curl/7.51.0', 
    accept: '*/*', 
    'content-length': '15', 
    'content-type': 'application/x-www-form-urlencoded' } 

要訪問原始緩衝區,您將不得不將其移動到route-prequisites。 所以路由的配置看起來像:

config: { 
    pre: [ 
     { 
      method: (request, reply) => { 
       //signature verification steps 
       return reply.continue(); 
      } 
     } 
    ], 
    payload: { 
     output: 'data', 
     parse: false 
    } 
} 
+0

太謝謝你了。但在我的處理程序中,我需要使用'request.payload',那麼我必須自己解析它? –

+1

@TrieuDang不幸的是,是的。因爲如果你將parse設置爲true,那麼我找不到任何方法來獲取原始緩衝區。它似乎被吞沒了:) –

+0

但現在還有另一個問題,我想在中間件中使用此緩衝區,而不是處理程序。我正在使用'server.ext()'來定義我的中間件,所以我怎麼能得到這個緩衝區? –