Этот вопрос и ответы дали мне направление в правильном направлении. Специально с unicode atob и btoa нельзя использовать «ваниль», и в эти дни все равно unicode ..
Непосредственно из Mozilla две хорошие функции для этой цели (протестированы с помощью юникода и html-тегов внутри)
function b64EncodeUnicode(str) {
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
return String.fromCharCode('0x' + p1);
}));
}
b64EncodeUnicode('✓ à la mode'); // "4pyTIMOgIGxhIG1vZGU="
b64EncodeUnicode('\n'); // "Cg=="
function b64DecodeUnicode(str) {
return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
}
b64DecodeUnicode('4pyTIMOgIGxhIG1vZGU='); // "✓ à la mode"
b64DecodeUnicode('Cg=='); // "\n"
Эти функции будут выполнять молниеносно по сравнению с необработанным декодированием base64, используя пользовательскую функцию javascript, поскольку btoa и atob выполняются вне интерпретатора.
Если вы можете игнорировать старый IE и старый мобильный телефоны (например, iphone 3?) это должно быть хорошим решением.
Измените server.js
на:
var scannedIp = 12.34.56.78;
var chatScan = Chat.find({ ip: scannedIp }, function (err, docs) {
if(err) return console.log(err)
console.log(docs.length)
})
КСТАТИ , метод find
является обещанием, поэтому, если вы хотите console.log
, его результаты выходят за пределы обратного вызова, тогда вам нужно сделать что-то вроде этого:
chatScan.then(docs => {
console.log(docs)
})