복붙노트

[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. ==============================

    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 및 설명되어 있습니다.

  2. from https://stackoverflow.com/questions/19994951/whats-going-on-with-meteor-and-fibers-bindenvironment by cc-by-sa and MIT license