0

私は一時的な偽のAPIを作成しており、これを実現するためにexpress.jsを使用してノードに単純な要求応答スクリプトを設定しようとしています。これは非常に簡単です。リクエストが届き、検証され、有効な場合は.jsonテンプレートファイルとマージされて結果が返されるため、ユーザーが正常に作成されたという印象を与えます。

  app.post('/agent/user', function(req, res){
    var responseTemplate = new jsonRequired('post_user');
    var errorTemplate = new jsonRequired('post_user_error');
    var payload = req.body;
    var responseData;
    var hasErrors = false;

    console.log('Creating new user');
    //Recursive Merge from http://stackoverflow.com/a/383245/284695

    responseData = new mergeRecursive(responseTemplate,payload);

    if(!payload.username){
      hasErrors = true;
      errorTemplate.errors.username.push('A username is required.');
    }

    if (hasErrors){
      res.send(errorTemplate,422);
    }else{
      res.send(responseData,200);
    }

  });

私が抱えている問題は、データが呼び出し間で持続していることです。したがって、1つのリクエストでユーザー名とname [first]を定義し、2番目のリクエストでユーザー名だけを定義すると、両方のリクエストがname[first]プロパティで返されます。

私はそれがjsクロージャと関係があると感じています。残念ながら、私が見つけたすべてのチュートリアルは、クロージャを回避するのではなく、クロージャを作成することに関するもののようです。

これは次のように機能するはずです。

  1. クライアントのPOSTusername=user1&name[first]=joe&name[last]=bloggs
  2. サーバーは、事前入力されたユーザーオブジェクトを含むjsonファイルをロードします。

    {"username":"demo","name":{"first":"John","last":"Doe"}...}

  3. mergeRecursive()POSTリクエストからのペイロードをテンプレートオブジェクトにマージし、新しいオブジェクトをPOST応答テキストとして返します。

問題は、新しいリクエストごとに、サーバーが.jsonファイルをリロードする代わりに、ステップ2のステップ3の結果を使用していることです。

4

3 に答える 3

1

この関数には、 jQuery.extendmergeRecursiveと同じ注意点があります。つまり、最初に送信されたオブジェクトを変更します。実際、その戻り値を使用する必要はありません。

jsonRequired関数のコードを表示しませんでしたが(new呼び出し時に使用した理由は明確ではありません)、この関数は呼び出されるたびに新しいオブジェクトを作成するのではなく、外部リポジトリからこのオブジェクトをフェッチするようです。 。明らかに、mergeRecursiveその関数が終了した後、その変更が失われることはありません。

解決策は、マージにデータオブジェクトを使用することです。このような:

var responseData = {};
...
mergeRecursive(responseData, responseTemplate);
mergeRecursive(responseData, payload);
于 2012-11-23T12:35:24.327 に答える
0

これでは問題は解決しませんが、npmから入手できるcloneextendパッケージを使用した回避策を見つけました。

$ npm install cloneextend

これにより、次のjsを使用できます。

var ce = require('cloneextend');

...

ce.extend(responseData, responseTemplate);
ce.extend(responseData, payload);
于 2012-11-23T15:15:18.893 に答える
0

2 つのオブジェクトをマージすると、これが作成されます。

responseTemplate実際のリクエストにはなかったパラメーターがある場合は、そこにあることになります。単語の定義を確認してくださいmerge;)

于 2012-11-23T12:43:41.643 に答える