Node.js-“btoa가 정의되지 않았습니다”오류
내 node.js 응용 프로그램 npm install btoa-atob
에서 클라이언트 측 자바 스크립트에서 기본이지만 어떤 이유로 노드에 포함되지 않은 btoa () 및 atob () 함수를 사용할 수 있도록했습니다. 새 디렉토리는 node.modules 폴더에 나타 났으며 app.js와 함께 루트에 있습니다. 그런 다음 루트에있는 package.json 파일에서 btoa-atob를 종속성으로 추가했는지 확인했습니다.
그러나 어떤 이유로 든 여전히 작동하지 않습니다.
console.log(btoa("Hello World!"));
^ "SGVsbG8gV29ybGQh"를 콘솔에 출력해야하지만 대신 "btoa is defiend"오류가 발생합니다.
제대로 설치하지 않았습니까? 무엇을 간과 했습니까?
'btoa-atob'모듈은 프로그래밍 인터페이스를 내 보내지 않으며 명령 줄 유틸리티 만 제공합니다.
Base64로 변환해야하는 경우 버퍼를 사용하여 수행 할 수 있습니다.
console.log(Buffer.from('Hello World!').toString('base64'));
역전 (복호하는 내용이 utf8 문자열이라고 가정) :
console.log(Buffer.from(b64Encoded, 'base64').toString());
참고 : 노드 V4 이전에 사용 new Buffer
보다는 Buffer.from
.
여기에 게시 된 솔루션은 ASCII가 아닌 문자로 작동하지 않습니다 (즉, Node.js와 브라우저간에 base64를 교환하려는 경우). 제대로 작동하려면 입력 텍스트를 '이진'으로 표시해야합니다.
Buffer.from('Hélló wórld!!', 'binary').toString('base64')
이것은 당신에게 제공합니다 SOlsbPMgd/NybGQhIQ==
. atob('SOlsbPMgd/NybGQhIQ==')
브라우저에서 만들면 올바른 방식으로 디코딩됩니다. Node.js에서도 다음을 통해 올바르게 수행합니다.
Buffer.from('SOlsbPMgd/NybGQhIQ==', 'base64').toString('binary')
"이진 부분"을 수행하지 않으면 특수 문자가 잘못 해독됩니다.
btoa npm 패키지의 구현에서 얻었습니다 .
내 팀은 React Native 및 PouchDB와 함께 Node를 사용할 때이 문제가 발생했습니다. 우리가 그것을 해결 한 방법은 다음과 같습니다.
NPM 설치 버퍼 :
$ npm install --save buffer
확인 Buffer
, btoa
및 atob
전역으로로드됩니다
global.Buffer = global.Buffer || require('buffer').Buffer;
if (typeof btoa === 'undefined') {
global.btoa = function (str) {
return new Buffer(str, 'binary').toString('base64');
};
}
if (typeof atob === 'undefined') {
global.atob = function (b64Encoded) {
return new Buffer(b64Encoded, 'base64').toString('binary');
};
}
나는 대답에서 심가 일 이상하지만, 그들은의 데스크탑 브라우저 '구현의 동작과 일치하지 않은 것을 발견 btoa()
과 atob()
:
const btoa = function(str){ return Buffer.from(str).toString('base64'); }
// returns "4pyT", yet in desktop Chrome would throw an error.
btoa('✓');
// returns "fsO1w6bCvA==", yet in desktop Chrome would return "fvXmvA=="
btoa(String.fromCharCode.apply(null, new Uint8Array([0x7e, 0xf5, 0xe6, 0xbc])));
결과적으로 Buffer
인스턴스는 기본적으로 UTF-8 로 인코딩 된 문자열을 나타내거나 해석 합니다. 반대로 데스크톱 Chrome에서는 latin1 범위를 벗어난 문자가 포함 된 문자열을 입력 할 수 없습니다 btoa()
. 예외가 발생하기 때문입니다.Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.
따라서, 당신은 명시 적으로 설정해야합니다 인코딩 형식 에 latin1
바탕 크롬의 인코딩 유형에 맞게 심은 당신의 Node.js를 위해서는 :
const btoaLatin1 = function(str) { return Buffer.from(str, 'latin1').toString('base64'); }
const atobLatin1 = function(b64Encoded) {return Buffer.from(b64Encoded, 'base64').toString('latin1');}
const btoaUTF8 = function(str) { return Buffer.from(str, 'utf8').toString('base64'); }
const atobUTF8 = function(b64Encoded) {return Buffer.from(b64Encoded, 'base64').toString('utf8');}
btoaLatin1('✓'); // returns "Ew==" (would be preferable for it to throw error because this is undecodable)
atobLatin1(btoa('✓')); // returns "\u0019" (END OF MEDIUM)
btoaUTF8('✓'); // returns "4pyT"
atobUTF8(btoa('✓')); // returns "✓"
// returns "fvXmvA==", just like desktop Chrome
btoaLatin1(String.fromCharCode.apply(null, new Uint8Array([0x7e, 0xf5, 0xe6, 0xbc])));
// returns "fsO1w6bCvA=="
btoaUTF8(String.fromCharCode.apply(null, new Uint8Array([0x7e, 0xf5, 0xe6, 0xbc])));
I understand this is a discussion point for a node application, but in the interest of universal JavaScript applications running on a node server, which is how I arrived at this post, I have been researching this for a universal / isomorphic react app I have been building, and the package abab
worked for me. In fact it was the only solution I could find that worked, rather than using the Buffer method also mentioned (I had typescript issues).
(This package is used by jsdom
, which in turn is used by the window
package.)
Getting back to my point; based on this, perhaps if this functionality is already written as an npm package like the one you mentioned, and has it's own algorithm based on W3 spec, you could install and use the abab
package rather than writing you own function that may or may not be accurate based on encoding.
---EDIT---
I started having weird issues today with encoding (not sure why it's started happening now) with package abab
. It seems to encode correctly most of the time, but sometimes on front end it encodes incorrectly. Spent a long time trying to debug, but switched to package base-64
as recommended, and it worked straight away. Definitely seemed to be down to the base64 algorithm of abab
.
I have a code shared between server and client and I needed an implementation of btoa inside it. I tried doing something like:
const btoaImplementation = btoa || (str => Buffer.from(str).toString('base64'));
but the Server would crush with:
ReferenceError: btoa is not defined
while Buffer
is not defined on the client.
I couldn't check window.btoa (it's a code shared, remember?)
So I ended up with this implementation:
const btoaImplementation = str => {
try {
return btoa(str);
} catch(err) {
return Buffer.from(str).toString('base64')
}
};
참고URL : https://stackoverflow.com/questions/23097928/node-js-btoa-is-not-defined-error
'Programing' 카테고리의 다른 글
IPython 노트북 마크 다운에 이미지 삽입 (0) | 2020.05.20 |
---|---|
jQuery 유효성 검사-숨겨진 필드에 대한 유효성 검사 사용 (0) | 2020.05.20 |
Django Forms에서 CSS 클래스 정의 (0) | 2020.05.20 |
pandas DataFrame에서 특정 열 이름 변경 (0) | 2020.05.20 |
SQL Server : sp_who2의 필터 출력 (0) | 2020.05.20 |