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],而在第二个请求中只定义了一个用户名,那么两个请求都会返回 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 响应文本返回。

问题是对于每个新请求,服务器都在步骤 2 中使用步骤 3 的结果,而不是重新加载 .json 文件。

4

3 回答 3

1

该函数与jQuery.extendmergeRecursive具有相同的警告:它修改发送到其中的第一个对象。事实上,你甚至不需要使用它的返回值。

您没有显示jsonRequired函数代码(甚至不清楚为什么new在调用它时使用它),但看起来这个函数每次调用时都不会创建一个新对象,而是从某个外部存储库中获取这个对象. 显然,mergeRecursive对该函数的修改不会在该函数结束后丢失。

解决方案是使用您的数据对象进行合并。像这样:

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

合并两个对象将为您完成此操作。

如果您的responseTemplatehas 参数,实际请求没有,那么您最终将在那里拥有它。检查单词的定义merge;)

于 2012-11-23T12:43:41.643 回答
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 回答