2016-11-17 52 views
5

在我的節點JS,我已經逃脫單引號與以下功能MongoDB的節點JS逃逸單引號的問題

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

這是對我工作的罰款。 但突然間我發現我的數據庫中有一個字符串'M'$。下面的查詢沒有返回。

param 1 = "M'$"; 

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

另請建議處理節點JS參數傳遞給MongoDB的最佳做法。 我從PHP代碼調用NodeJS。我正在從PHP代碼發送參數rawurlencode()。在節點js中,我使用decodeURI()來接收參數。

編輯:

我對主叫方節點JS PHP代碼:

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代碼是搜索,所以我使用RegEXP()。對於其他情況,我使用以下代碼:

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

這裏是否需要正則表達式搜索? – hyades

+0

是的。它是我的網站的搜索查詢。所以正則表達式需要 – Arijit

+0

你是怎麼調用node.js的?通過「捲曲」或通過命令行?你如何在NodeJS中接收參數 - 使用Express或?至於正則表達式,你是否需要^表示「開始行」?如果您顯示如何將條目輸入到Mongo以驗證搜索,將有所幫助。 – Robbie

回答

1

問題出在$符號上。這是一個特殊的字符,應該逃脫,因爲通常意味着輸入結束。您必須更新regescape函數,因爲它只能轉義單引號和方括號 - 所以您至少還要在其中添加美元符號。

也似乎你的regescape函數在某些情況下不能按預期工作。試着舉例來傳遞這個值:test[]'。我想你希望得到test\[\]\',但實際上你會得到test\[]'

因此,爲了解決這個問題,並添加DOLAR標誌 - 它應該是這樣的:

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

管道(|)表示or,所以它只是逃脫了集合中的任何符號。將來您可以輕鬆地在該處添加更多角色。

+0

感謝您的答覆。這適用於特定情況M'$。但它不適用於正常情況。例如,考慮這個字符串「他的名字」。所以如果只有單引號,則不起作用。 – Arijit

+0

@Arijit什麼不工作? 'regescape'函數或MongoDB搜索?'regescape'返回'他的名字',並帶有單引號。 – rkm

+0

是的,這是真的,但是當我在mongodb中使用轉義參數時,它不返回任何結果。考慮這個節點js查詢mongodb:var cursor = db.collection('employees')。find({「dep.name」:regescape(param1),「mrg.name」:regescape(param2)}); – Arijit