Javascript 为什么node.js变量会持久化

Javascript 为什么node.js变量会持久化,javascript,node.js,express,Javascript,Node.js,Express,我正在制作一个临时的假API,并试图使用express.js在节点中设置一个简单的请求-响应脚本来实现这一点。它非常简单,一个请求进入,被验证,如果有效,则与一个.json模板文件合并并返回结果,从而给人一种用户成功创建的印象 app.post('/agent/user', function(req, res){ var responseTemplate = new jsonRequired('post_user'); var errorTemplate = new json

我正在制作一个临时的假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个请求中仅定义用户名,则两个请求都会返回name[first]属性

我觉得这与js闭包有关。不幸的是,我找到的每个教程似乎都是关于闭包的,而不是避免闭包

它应该是这样工作的:

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

    {“用户名”:“演示”,“姓名”:{“第一名”:“约翰”,“最后一名”:“Doe”}…}

  • mergeRecursive()
    将POST请求中的有效负载合并到模板对象上,并将新对象作为POST响应文本返回


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

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

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

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

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

    合并两个对象将为您实现这一点

    如果您的
    responseTemplate
    有实际请求没有的参数,那么您将在那里得到它。
    检查单词的定义(合并)

    虽然这不能解决我遇到的问题,但我已经找到了一个解决方法,使用npm提供的软件包:

    $ npm install cloneextend
    
    这允许我使用以下js:

    var ce = require('cloneextend');
    
    ...
    
    ce.extend(responseData, responseTemplate);
    ce.extend(responseData, payload);
    

    你能解释一下你想做什么吗?坦白地说,我不太明白你的问题。我已经为你添加了一个解释。希望它能清除它。这应该发生,因为您正在与json模板合并,并且默认情况下json模板包含“name[first]”属性。是的,但如果第二次POST请求没有姓,我希望它使用默认的
    Doe
    ,而不是
    bloggs
    ,这是合并的bcz。你只是简单地合并东西。所以,如果一个人没有它,那么结果仍然会有它。
    jsonRequired(file)
    只是一个小助手,它返回一个json文件,带有
    returnrequire(dir+file+扩展名)
    require
    将加载的对象缓存在
    require.cache
    global object()中,因此所有后续调用都将返回这些对象。