我正在制作一个临时假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闭包有关。不幸的是,我发现的每个教程似乎都是关于制作闭包,而不是避免它们。
它应该像这样工作:
username=user1&name[first]=joe&name[last]=bloggs
服务器加载包含预先填充的用户对象的json文件:例如
{"username":"demo","name":{"first":"John","last":"Doe"}...}
mergeRecursive()
将POST请求中的有效内容合并到模板对象上,并将新对象作为POST响应文本返回。
问题是,对于每个新请求,服务器都使用步骤2中步骤3的结果,而不是重新加载.json文件。
答案 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);