Javascript 为什么node.js变量会持久化
我正在制作一个临时的假API,并试图使用express.js在节点中设置一个简单的请求-响应脚本来实现这一点。它非常简单,一个请求进入,被验证,如果有效,则与一个.json模板文件合并并返回结果,从而给人一种用户成功创建的印象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
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
{“用户名”:“演示”,“姓名”:{“第一名”:“约翰”,“最后一名”:“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()中,因此所有后续调用都将返回这些对象。