MongoDB Node JS转义单引号问题

在我的Node js中,我已经用下面的函数逃脱了单引号

var regescape = function(text) { return text.replace(/[\[\]']+/g, "\\$&"); }; 

这对我来说工作得很好。 但突然间,我发现我的数据库中有一个string“M $”。 哪个不是以我的下面的查询返回。

 param 1 = "M'$"; var cursor = db.collection('search').find({"searchcontent.name":new RegExp('^'+regescape(param1))}).limit(10); 

另请build议处理NodeJSparameter passing给MongoDB的最佳做法。 我从PHP代码调用NodeJS。 我正在从PHP代码发送参数与rawurlencode() 。 在节点js中,我使用decodeURI()来接收参数。

编辑:

我的PHP代码调用节点JS:

 function getdetail($data1) { $p1 = $data1; $service_url = 'http://exampleserver:8081/search?param1='.$p1; $curl = curl_init($service_url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $curl_response = curl_exec($curl); if ($curl_response === false) { $info = curl_getinfo($curl); curl_close($curl); die('error occured.Please try later'); } curl_close($curl); $decoded = json_decode($curl_response, true); if (isset($decoded->response->status) && $decoded->response->status == 'ERROR') { die('error occured.Please try later'); } return $decoded; } 

节点接收数据的JS代码:

 app.get('/search', function (req, res) { var param1=decodeURI(req.query.param1); MongoClient.connect(url, function(err, db) { assert.equal(null, err); search(param1,db, function(data){ db.close(); res.end(JSON.stringify(data)); }); }); }); var search = function(param1,db, callback) { var cursor = db.collection('search').find({$or:[{"searchcontent.name":new RegExp('^'+regescape(param1))},{"searchcontent.name":new RegExp('^'+regescape(param1.substring(0,4)))}]}).limit(10); cursor.toArray(function(err, items) { callback(items); }); }; 

这节点JS代码是用于search,所以我使用了RegEXP() 。 对于其他情况我使用下面的代码:

 var cursor = db.collection('employees').find({"dep.name":regescape(param1),"mrg.name":regescape(param2)}); 

问题是$符号。 这是一个特殊的字符,应该逃脱,因为通常意味着input结束。 你必须更新regescape函数,因为它只能转义单引号和方括号 – 所以你至lessregescape在那里添加美元符号。

在某些情况下,您的regescape函数也不像预期的那样工作。 尝试例如传递这个值: test[]' 。 我认为你期望得到test\[\]\' ,但实际上你会得到test\[]'

所以为了修复它并添加dolar标志 – 应该是这样的:

 var regescape = function(text) { return text.replace(/'|\$|\[|\]/g, "\\$&"); }; 

pipe(|)的意思是,所以它只是从集中的任何符号转义。 将来您可以轻松地添加更多字符。