2016-04-08 6 views
1

を終えた後、私はRestifyルートが

server = restify.createServer({...}); 
server.use(restify.acceptParser(server.acceptable)); 
server.use(restify.queryParser()); 
server.use(restify.bodyParser()); 
... 
app.post('/test/:id', function (req, res, next) {...}) 
server.use(function(err, req, res, next) { 
     logger.error({req: req}, "error processing request"); 

    }); 

、一般的なエラー処理を行うためのRestifyの「使用()」メソッド、例えばを使用するTREDが、最後.USE()ハンドラは後に呼び出されることはなかった)(使用しますルート処理を完了しました。 ルートの後に「登録済み」でした。私はサーバの起動時に見ることができます。私のルートが処理された後、この.use()が処理されました。私はかなり新しく復元するので、私の質問は、.user()メソッドは、ルートの終了後にハンドラを適用することができます。私は、経路終了後に処理を行うために 'after'イベントを聞くことができますが、.use()ハンドラを実行できるかどうかを確認したいと思います。

更新日: ここに簡略化したコードを示します。 server.post()の前に登録された.use()メソッドは呼び出されましたが、server.post()の後に登録されたメソッドは呼び出されませんでした。助言がありますか?

var restify = require('restify'); 
var cookieParser = require('restify-cookies'); 
var helmet = require('helmet'); 
var util = require('util'); 
var logger = require('./util/logger'); 


module.exports = function(server){ 
    server.use(restify.acceptParser(server.acceptable)); 
    server.use(restify.queryParser()); 
    server.use(restify.bodyParser()); 

    server.use(helmet.noCache()); 
    server.use(helmet.hidePoweredBy()); 

    server.use(cookieParser.parse); 

    // this .use() method is called when accessing the server.post route below 
    server.use(function(req, res, next) { 
    console.log('BERORE ROUTE'); 
    return next(); 
    }); 

    server.post('/test/:returnId', function (req, res, next) { 
    var err = new restify.errors.InternalServerError('oh noes!'); 
    return next(err); 
    }); 

    // this .use() method is not called when accessing the server.post route above 
    server.use(function(req, res, next) { 
    console.log('Tata...'); 
    return next(); 
    }); 
}; 
+0

補正示すように:誤植、app.post( '/試験/:ID'、関数(REQ、RES、次){...})がサーバであるべきです。 – Jane

+0

@migg私はnext()を呼び出しました。 server.post()の前の.use()メソッドは呼び出されましたが、server.post()の後のものは呼び出されませんでした。 – Jane

答えて

1

私はあなたがnextを呼び出さないと思いますので、次のミドルウェア(use文での伐採ミドルウェア)が呼び出されることはありません

app.post('/test/:id', function (req, res, next) { 
    // what is happening here? 
}); 

内のコードを見るのは興味深いだろう。したがって、next()を呼び出すと、ミドルウェアが呼び出されます。

しかし、多分エラーが発生してrestify docsで説明したようにエラーを処理するためにあなたのケースで良いだろう:

app.post('/test/:id', function (req, res, next) { 
    // some internal unrecoverable error 
    var err = new restify.errors.InternalServerError('oh noes!'); 
    return next(err); 
}); 

app.on('InternalServer', function (req, res, err, next) { 
    //err.body = 'something is wrong!'; 
    logger.error({req: req}, "error processing request"); // <= from your code 
    return next(); 
}); 

しかし、これはあなたが達成したいかに依存し、あなたが内部で何をしていますかapp.post

0

最後の「使用」ハンドラが呼び出されない理由は、ハンドラがルートに割り当てられるときにハンドラチェーンに存在しないためです。各 "use"コールに対して、restifyはそのハンドラをハンドラの配列に追加します。

ルート関数(get、postなど)が呼び出されると、restifyはそのルートに対して呼び出される一連のハンドラを作成します。各ルートのハンドラーの連鎖は、そのルートのために渡されたものから構築され、これまでの「使用」呼び出しで見つかったすべてのハンドラーで準備されています。

したがって、server.post関数の呼び出しが処理されると、 "Tata ..."ハンドラはハンドラチェーンにまだ存在しないため、前置されません。そのため、すべての「使用」コールは常にルートの上に置かれます。

これを説明するために、私は2つのconsole.logステートメントをrestifyのserver.use関数の中に置きました。ミドルウェアハンドラを使ってチェーンビルディングを見ることができます(私はあなたの関数を "before"と "error_handler"という名前にして、それらが出力で明らかになるようにしました)。 server.useへの最後の呼び出しですべてのミドルウェアハンドラを含むチェーンが生成されますが、posttestreturnIdルートのハンドラには、呼び出された時点で配列になかったため、 "error_handler"は含まれません。

[ [Function: parseAccept] ] // the handler chain 
{}       // the routes and their handlers 
[ [Function: parseAccept], 
    [Function: parseQueryString] ] 
{} 
[ [Function: parseAccept], 
    [Function: parseQueryString], 
    [Function: readBody], 
    [Function: parseBody] ] 
{} 
[ [Function: parseAccept], 
    [Function: parseQueryString], 
    [Function: readBody], 
    [Function: parseBody], 
    [Function: nocache] ] 
{} 
[ [Function: parseAccept], 
    [Function: parseQueryString], 
    [Function: readBody], 
    [Function: parseBody], 
    [Function: nocache], 
    [Function: hidePoweredBy] ] 
{} 
[ [Function: parseAccept], 
    [Function: parseQueryString], 
    [Function: readBody], 
    [Function: parseBody], 
    [Function: nocache], 
    [Function: hidePoweredBy], 
    [Function: parseCookies] ] 
{} 
[ [Function: parseAccept], 
    [Function: parseQueryString], 
    [Function: readBody], 
    [Function: parseBody], 
    [Function: nocache], 
    [Function: hidePoweredBy], 
    [Function: parseCookies], 
    [Function: before] ] 
{} 
[ [Function: parseAccept], 
    [Function: parseQueryString], 
    [Function: readBody], 
    [Function: parseBody], 
    [Function: nocache], 
    [Function: hidePoweredBy], 
    [Function: parseCookies], 
    [Function: before], 
    [Function: error_handler] ] 
{ posttestreturnid: 
    [ [Function: parseAccept], 
    [Function: parseQueryString], 
    [Function: readBody], 
    [Function: parseBody], 
    [Function: nocache], 
    [Function: hidePoweredBy], 
    [Function: parseCookies], 
    [Function: before], 
    [Function: returnId] ] } 
+0

ExpressからRestifyに来て、この実装の背後にあるロジックを私あなたが動詞のルートの後にミドルウェアを望む理由の*負荷*を考えることができます。 – James

0

他のルートの後にserver.use()を使用しないで関数を実行する場合は、代わりに以下のコードを使用します。

// this .use() method is called when accessing the server.post route below 
server.use(function(req, res, next) { 
    console.log('BERORE ROUTE'); 
    return next(); 
}); 

server.post('/test/:returnId', function (req, res, next) { 
    var err = new restify.errors.InternalServerError('oh noes!'); 
    return next(err); 
}); 

server.on('after', function(req, res, next) { 
    console.log('Tata...'); 
    return next(); 
}); 

ここhttp://restify.com/#audit-logging

関連する問題