2015-09-01 49 views
2

我是JS新手,開始使用sails框架。我需要解析中間件中的http res體來將工作放在芹菜隊列中。我嘗試過使用skipper-按照文檔 - 但我總是將res.body的值設置爲undefined。當我登錄回覆時,我只能得到關於相同的元信息。Sailsjs中間件解析res.body

下面是我正在嘗試的中間件代碼 - 有人可以讓我知道我做錯了什麼?

order: [ 
    'startRequestTimer', 
    'cookieParser', 
    'session', 
    'requestLogger', 
    'bodyParser', 
    'handleBodyParserError', 
    'compress', 
    'methodOverride', 
    'poweredBy', 
    '$custom', 
    'router', 
    'www', 
    'favicon', 
    '404', 
    '500' 
], 

requestLogger: function (req, res, next) { 
    var start = (new Date().getTime()); 
    res.on('finish', function(){ 
     console.log(res.body) 
    }); 
    return next(); 
}, 

bodyParser: require('skipper') 

PS:我沒有掛在船長身上 - 只要能夠解析結果的身體,這一切都很好。謝謝!

回答

1

船長用於解析請求體。在Sails(以及所有基於Express的應用程序)中傳遞的response對象不包含實際響應,它只是用於形成響應的一組方法集合。一旦您觸發類似res.send的響應,就沒有簡單的方法來攔截它。相反,您可以使用Sails custom response,並在實際發送輸出之前對自定義響應中的數據執行任何操作。這裏的最佳做法是使用res.ok(「ok」響應)。因此,在你的帆控制器,在那裏你可以做

res.send(someData) 

代替,做

res.ok(someData) 

,然後在api/responses/ok.js文件,作業添加到您的隊列或任何你需要做的。

而且,把config/http.js文件回到你發現了它,直到你真的需要惹中間件或身體解析器;-)

+0

迴應是不好的地方工作有點這個。中間件是最好的地方,所以他可以用'req.body'替換'res'作爲中間件,並使其工作。 – ghaiklor

+0

@EugeneObrezkov這根本不是真的。 'req.body'包含_request _--發送到服務器的數據的主體。它與服務器發回的數據無關。 Express與其他一些框架(如Django)沒有「響應」中間件;一箇中間件可以(通過引用Express的文檔)「調用(例如)'res.send'結束請求 - 響應循環」,但是之後將不會調用其他中間件。如果目標是在將其發送到客戶端之前以某種標準方式操作服務器響應,那麼Sails響應就是答案。 – sgress454

+0

據我所知,他想「我需要解析http res體」。然後我們討論了他在'res.body'中犯了一個錯誤,所以他需要用'req.body'替換。也許我錯了,但我認爲他正在試圖解析請求,並且不做任何迴應。 – ghaiklor

1

有沒有這樣的事情res.body。其req.body

http://sailsjs.org/documentation/reference/request-req/req-body

+0

好,感謝陳述obvious-作爲問題明─我希望的方式解析服務返回的響應主體,然後將其轉發給中間件中的客戶端(如果可能的話)。不過謝謝你的答案。 –