[MONGODB] 유성 및 섬유 / bindEnvironment ()와 함께 무슨 일이야?
MONGODB유성 및 섬유 / bindEnvironment ()와 함께 무슨 일이야?
나는 섬유를 사용하여 어려움을 겪고 / Meteor.bindEnvironment (). 나는 컬렉션이 비어 시작하면 컬렉션에 코드 업데이트 및 삽입을하려고 노력했다. 이 모든 시작시 서버 측을 실행하기로되어있다.
function insertRecords() {
console.log("inserting...");
var client = Knox.createClient({
key: apikey,
secret: secret,
bucket: 'profile-testing'
});
console.log("created client");
client.list({ prefix: 'projects' }, function(err, data) {
if (err) {
console.log("Error in insertRecords");
}
for (var i = 0; i < data.Contents.length; i++) {
console.log(data.Contents[i].Key);
if (data.Contents[i].Key.split('/').pop() == "") {
Projects.insert({ name: data.Contents[i].Key, contents: [] });
} else if (data.Contents[i].Key.split('.').pop() == "jpg") {
Projects.update( { name: data.Contents[i].Key.substr(0,
data.Contents[i].Key.lastIndexOf('.')) },
{ $push: {contents: data.Contents[i].Key}} );
} else {
console.log(data.Contents[i].Key.split('.').pop());
}
}
});
}
if (Meteor.isServer) {
Meteor.startup(function () {
if (Projects.find().count() === 0) {
boundInsert = Meteor.bindEnvironment(insertRecords, function(err) {
if (err) {
console.log("error binding?");
console.log(err);
}
});
boundInsert();
}
});
}
이 글을 쓰는 내 처음으로, 나는 그 파이버에 넣어해야하기 때문에, 대신 Meteor.bindEnvironment을 시도 추천 IRC 누군가 ()에 대한 논의를 한 후, 파이버 () 블록 내 콜백을 마무리해야한다는 오류를 얻었다. 하지 작업 (유일한 출력 I 톱이 삽입되었다 ..., bindEnvironment ()가 오류가 발생하지 않았다, 그러나 또한 블록의 코드 내부의 어떤을 실행하지 않는 것을 의미) 않았다. 그리고 나는이에 도착. 내 오류가 이제 오류 : 유성 코드는 항상 섬유 내에서 실행해야합니다. 당신이 Meteor.bindEnvironment 비 - 유성 도서관에 전달할 것을 포장 콜백을보십시오.
나는 노드에 새로운 오전과 완전히 섬유의 개념을 이해하지 않습니다. 나의 이해는 스레딩 C / C ++ / 모든 언어의 스레드에 그들이있는 거 유사하다,하지만 난 왜 내 코드가 삽입하려고 오류를 던지고 내 서버 측 코드를 연장하는 의미가 / 무엇인지 이해하지 못하는 모음. 사람이 나에게 이것을 설명 할 수 있습니까?
고맙습니다.
해결법
-
==============================
1.당신은 약간 잘못 bindEnvironment을 사용하고 있습니다. 사용의 존재가 섬유에 이미와 녹스 클라이언트 벗기 콜백 더 이상 섬유에없는 경우 때문입니다.
당신은 약간 잘못 bindEnvironment을 사용하고 있습니다. 사용의 존재가 섬유에 이미와 녹스 클라이언트 벗기 콜백 더 이상 섬유에없는 경우 때문입니다.
bindEnvironment (! 내가 더있을 수, 생각할 수 있음)의 두 가지 사용 사례가 있습니다 :
Meteor.bindEnvironment는 새로운 섬유에 새로운 섬유 복사 현재 섬유의 변수와 환경을 만듭니다. 당신이 당신의 NOM 모듈의 방법 콜백을 사용할 때 당신이 필요로하는 점이다.
다행히 Meteor.wrapAsync라는 섬유에 당신과 바인딩에 대한 콜백 콜백 대기을 담당 대안이있다.
당신은이 작업을 수행 할 수 있도록 :
시동 기능은 이미 섬유와 당신이 여기 bindEnvironment 필요하지 않습니다 그래서 콜백 있습니다.
Meteor.startup(function () { if (Projects.find().count() === 0) { insertRecords(); } });
그리고 당신의 삽입 기록은 콜백을 필요가 없습니다 (wrapAsync 사용) 기능
function insertRecords() { console.log("inserting..."); var client = Knox.createClient({ key: apikey, secret: secret, bucket: 'profile-testing' }); client.listSync = Meteor.wrapAsync(client.list.bind(client)); console.log("created client"); try { var data = client.listSync({ prefix: 'projects' }); } catch(e) { console.log(e); } if(!data) return; for (var i = 1; i < data.Contents.length; i++) { console.log(data.Contents[i].Key); if (data.Contents[i].Key.split('/').pop() == "") { Projects.insert({ name: data.Contents[i].Key, contents: [] }); } else if (data.Contents[i].Key.split('.').pop() == "jpg") { Projects.update( { name: data.Contents[i].Key.substr(0, data.Contents[i].Key.lastIndexOf('.')) }, { $push: {contents: data.Contents[i].Key}} ); } else { console.log(data.Contents[i].Key.split('.').pop()); } } });
몇 가지 염두에 두어야합니다. 섬유 스레드처럼되지 않습니다. NodeJS에서 단 하나의 스레드가 있습니다.
섬유는 더 동시에하지만 대기 유형의 시나리오가있는 경우 (인터넷에서 예컨대 다운로드 파일을) 서로를 차단하지 않고 실행할 수있는 이벤트 같다.
그래서 당신은 동기 코드가 다른 사용자의 이벤트를 차단할 수 없습니다. 그들은 실행 교대로 여전히 단일 스레드에서 실행됩니다. 유성은 서버 측에서 동기 코드가 어떻게이 그래서, 아직 다른 사용자가이에 의해 차단되지 않습니다, 물건을 기다릴 수 있고, 물건을 할 수 있기 때문에 다른 섬유에 자신의 코드가 실행됩니다.
크리스 메이는 http://eventedmind.com에이 좋은 기사 몇있다
Meteor.wrapAsync는 당신이 첫 번째 매개 변수로 제공하는 방법에 받아 현재 섬유에 실행됩니다.
또한, 그 방법은 제 PARAM 같은 함수 에러 및 제 결과 콜백 (ERR, 결과)이 마지막 PARAM 소요 가정 (IT 콜백을 첨부.
콜백이 발사 될 때까지 콜백은 Meteor.bindEnvironment 및 블록 현재 섬유를 바인딩됩니다. 즉시 콜백이 화재로이 결과를 반환 또는 ERR 발생합니다.
그래서 당신이 다음 줄에 방법의 결과를 사용할 수 있기 때문에 동기 코드로 비동기 코드를 변환하는 대신 콜백을 사용하여 깊은 기능을 중첩에 매우 편리합니다. 당신이 당신의 섬유의 범위를 잃어 버릴까 걱정하지 않아도 그것은 또한 당신을 위해 bindEnvironment을 처리합니다.
업데이트 Meteor._wrapAsync 지금 Meteor.wrapAsync 및 설명되어 있습니다.
from https://stackoverflow.com/questions/19994951/whats-going-on-with-meteor-and-fibers-bindenvironment by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB를 Linq에 거기에 "쿼리 설명"인가? (0) | 2019.12.15 |
---|---|
[MONGODB] 어떻게 효율적으로 몽고에서의 요청에 의한 문서를 삭제하려면? (0) | 2019.12.15 |
[MONGODB] MongoDB의 : 통합 프레임 워크 : 필드 사이에 $ 일치 (0) | 2019.12.15 |
[MONGODB] 현재 값을 기준으로하여 MongoDB에 값을 업데이트 (0) | 2019.12.15 |
[MONGODB] 어떻게하여 MongoDB의 루트 레벨로 하위 문서를 평평하게하는? (0) | 2019.12.15 |