为什么node.js变量持久化

时间:2012-11-23 12:09:56

标签: javascript node.js express

我正在制作一个临时假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个请求中定义用户名和名[first],而在第2个请求中只定义用户名,则两个请求都会返回名称[first]属性。

我觉得这与js闭包有关。不幸的是,我发现的每个教程似乎都是关于制作闭包,而不是避免它们。

它应该像这样工作:

  1. 客户端POST username=user1&name[first]=joe&name[last]=bloggs
  2. 服务器加载包含预先填充的用户对象的json文件:例如

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

  3. mergeRecursive()将POST请求中的有效内容合并到模板对象上,并将新对象作为POST响应文本返回。

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

3 个答案:

答案 0 :(得分:1)

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

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

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

var responseData = {};
...
mergeRecursive(responseData, responseTemplate);
mergeRecursive(responseData, payload);

答案 1 :(得分:0)

合并两个对象将为您提供此功能。

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

答案 2 :(得分:0)

虽然这不能解决我遇到的问题,但我找到了使用npm提供的cloneextend包的解决方法:

$ npm install cloneextend

这允许我使用以下js:

var ce = require('cloneextend');

...

ce.extend(responseData, responseTemplate);
ce.extend(responseData, payload);