2017-10-09 5 views
0

私は、メディアのIDを含むXMLの入力を受け取り、与えられたIDの詳細をXML形式で出力するAPIを開発しています。 2番目の同時リクエストの応答を送信しているときに問題に直面しています。ここで2番目のリクエストは、郵便配達員の「積載」を示すループに入ります。nodejsで同時にリクエストを処理し、1つのres.sendだけを使ってレスポンスを渡します。

私がやっているのは、の関数を呼び出してメディアを解析し、コールバックで出力し、res.sendを使って送信しますが、1回の要求に対してのみ機能します。

私はres.sendを使用しているので、同じAPIへの並列要求をループするか、送信後にヘッダーを設定できませんが、res.sendが応答を送信するために使用できる唯一の方法です次は動作しません)。

var getCompositeData = function(req, res, next){ 
    abc.getData(req.body, function(err, xmlOutput){ 
    if(err){ 
    console.log("error"); 
    } else { 
    xmlData = xmlOutput 
    return next() 
    } 
} 

app.post(apiUrl, [ 
    rawBodyParser({ 
    type: 'application/xml' 
    }), 
    app.oauth.authorise() 
], getCompositeData, function (req, res) { 
    res.setHeader('Content-Type', 'application/xml'); 
    res.send(xmlData); 
}); 
+2

少なくともシェア_some_コード、それ以外の私たちはあなたを助けるためにどのようには考えています。 – robertklep

+0

abc.getDataは、データを解析し、xml出力をapp.postに戻す別のnodejsファイルの関数です。 – Priyanka

答えて

0

あなたのコードにはいくつかの問題があります:エラーが発生した場合

if (err) { 
    console.log("error"); 
} 

が、あなたはまだ、タイムアウトが発生するまでそれ以外の要求は停止します、応答が送り返されることを確認する必要があります。あなたはnextにエラーを渡すことができ、およびExpressは、それを処理します:

if (err) { 
    return next(err); 
} 

次の問題:

xmlData = xmlOutput 

xmlDataが要求ごとに上書きされ宣言されていない変数、です。 (ほとんどの場合)2つのリクエストが(ほとんど)同じ時刻に発生した場合、1つのクライアントが不正な応答を返す可能性があります(Node.jsはJSコードを1つのスレッドで実行し、スレッドローカルストレージはないので、xmlDataはすべてのリクエスト)。

「ストア」には良い場所この種のデータはres.localsである:

res.locals.xmlData = xmlOutput; 
return next(); 

// and later: 
res.send(res.locals.xmlData); 
+0

データを保存する新しい方法を提案しても、私のprobemはまだ存在します。 res.sendは並列要求に対しては機能しませんが、何らかのエラーも与えません。並列要求の処理を調べてください。 – Priyanka

+0

おそらく 'abc.getData()'を共有するべきです。 – robertklep

+0

皆さんのご協力ありがとうございました。npm express-queueは私の問題を解決しました。https://www.npmjs.com/package/express-queue問題は私のabc.getData()でいくつかの非同期呼び出しがあったことでした。 :-) – Priyanka

関連する問題