2017-02-08 3 views
1

Restifyを使用していて、Restifyライブラリのどこかで、ユーザー側の入力が不正であるため例外がスローされています。私は問題を再現する以下の簡単なコードを持っています。以下の例の問題は、非同期関数で、doesntexist.nofunctionを実行しようとしています。何が起こるかは、 "server.on( 'uncaughtException .."関数で捕捉された例外ですが、 "err"オブジェクトは実際には "IncomingMessage"タイプであり、 "Error"タイプではありません。これについて。throwされたJavaScript例外のタイプが「エラー」

1)例外は常にタイプ「エラー」であることとされていない場合、 これはRestifyのバグです?スローすべき

2)にも エラーがあるかどう「ERR」パラメータを設定するコールバックパラメータに取り、そしてライブラリが投げるとは対照的に、クライアントが コールバックでそれを処理させるライブラリのベストプラクティスことです例外?

var restify = require('restify'); 

//Test with long stack traces and without it. 
//var longStackTraces = require('long-stack-traces'); 

const server = restify.createServer({ 
    name: 'myapp', 
    version: '1.0.0' 
}); 

server.get('/', function (req, res, next) { 
    try { 
     setTimeout(function() { 
      doesntexist.nofunction(); 
     }, 200); 

     return next(); 
    } catch (err) { 
     console.log("Caught error"); 
    } 
}); 

server.on('uncaughtException', function (err) { 
    console.log("uncaught exception1: " + err.constructor); 
}); 

process.on('uncaughtException', function (err) { 
    console.log("uncaught exception2: " + err.constructor); 
}); 

server.listen(9123, function() { 
    console.log('%s listening at %s', server.name, server.url); 
}); 

試験:長いスタックトレース無し

curl http://localhost:9123 

コンソール出力:長いスタック・トレース無し

myapp listening at http://[::]:9123 
uncaught exception1: function IncomingMessage(socket) { 
    Stream.Readable.call(this) 
... 
Error: uncaught exception1 
    at Server.<anonymous> (/usr/apps/myapp/Temp.js:22:12) 
    at emitMany (events.js:132:20) 
    at Server.emit (events.js:201:7) 
    at Domain.onError (/usr/apps/myapp/node_modules/restify/lib/server.js:968:18) 
    at emitOne (events.js:96:13) 
    at Domain.emit (events.js:188:7) 
    at Domain._errorHandler (domain.js:97:23) 
    at process._fatalException (bootstrap_node.js:293:33) 

コンソール出力:

+0

基本的に何かをスローすることはできますが、メッセージとスタックトレースを*持つ必要があります。例えば、プリミティブ値を投げてはいけません。 – Bergi

答えて

1
  1. ノードスタイルのコールバック関数には、sig最初の引数としてerrという性質があります。これはそれ自体ではなく、コミュニティの規範です。

あなたのコードこのようなものです:伝統があるよう

server.get('/', function (req, res, next) { 
    setTimeout(function() { 
     try { 
      doesntexist.nofunction(); 
      next(); 
     } catch (err) { 
      next(err); 
     } 
    }, 200); 
}); 

nextは、最初の引数としてerrを持つノードスタイルのコールバックです:

server.get('/', function (req, res, next) { 
    try { 
     setTimeout(function() { 
      doesntexist.nofunction(); 
     }, 200); 

     return next(); 
    } catch (err) { 
     console.log("Caught error"); 
    } 
}); 

私はこのように書き換えます。必要に応じてerr引数を指定して使用してください。

+0

コンセンサスがないという主張の出所を提供できますか? – Bergi

+0

私は、「証拠の欠如は欠席の証拠ではない」という誤解を認識しています。私は私の主張を削除します。 –

+0

@Joe、 "err"は常にオブジェクトタイプ "Error"であるべきですか? – user994165

関連する問題