2016-07-28 13 views
2

imap-simple NPMパッケージを使用して電子メールをチェックしていて、挿入が正しく機能するのに問題があります。Meteor 1.3を使用してNPMからコレクションに挿入できません

私はすでにこのページを読んでいます:https://guide.meteor.com/using-npm-packages.html#async-callbacks - 私は提案を試みましたが、どれも動作していません!

私はコードを少しだけ単純化して動作させようとしましたが、まだ運がありません。

meteor npmはimap-simpleをインストールし、上記のコードをサーバーに投げ、電子メールの資格情報を追加してメソッドを呼び出します。件名のにconsole.logが働いている

var imaps = require('imap-simple'); 
var config = { 
    imap: { 
     user: '<removed>', 
     password: '<removed>', 
     host: 'imap.gmail.com', 
     port: 993, 
     tls: true, 
     authTimeout: 3000 
    } 
}; 

Meteor.methods({ 

    api_connectEmail: function() { 
     console.log('Received call to connect email'); 

     imaps.connect(config).then(function (connection) { 

      return connection.openBox('INBOX').then(function() { 
       var searchCriteria = [ 
        'UNSEEN' 
       ]; 

       var fetchOptions = { 
        bodies: ['HEADER', 'TEXT'], 
        markSeen: true 
       }; 

       return connection.search(searchCriteria, fetchOptions).then(function (results) { 
        results.map(function (res) { 

         var subject = res.parts.filter(function (part) {return part.which === 'HEADER';})[0].body.subject[0]; 
         console.log("Subject: " + subject); 

         // insert 
         var attributes = { 
          subject: subject 
         }; 
         console.log("Attempting to insert to collection..."); 
         var newData = TempEmailCollection.insert(attributes); 
         console.log("New Database Entry ID: " + newData); 

        }); 
       }); 
      }); 
     }) 
    } 
}); 

は、ここに私のコードです。インサートが機能していません。エラーはありません。console.logポスト挿入はありません。

ガイドで推奨されている両方の方法を試しましたが、いずれも動作しません。

+0

TempEmailCollectionとは何ですか? – Darren

+0

@Darrenメール情報を格納するために特別に作られたMongoコレクション。通常、流星のどこにいても、.insertはコレクションで動作します。しかし、NPMモジュールではありません。そして、伝統的に働く方法は私のために働いていません。 –

+0

コードを表示する必要があります。この全体的な質問はそれに関連しているように見えますが、あなたは電子メール(あなたが働いていると言います) – Darren

答えて

0

問題は、Promiseハンドラと呼ばれる非同期にMeteor関数を呼び出していることです。 しかし、サーバー上で呼び出されるすべてのMeteor関数は、ファイバーで実行する必要があります。 このケースではMeteorは実際にエラーをスローしますが、約束のためにcatch関数を指定していないため無視しています。

は、(それだけでサーバーに接続し、新しい文書を挿入しようとする)は、以下の簡単な例を考える:

import { Meteor } from 'meteor/meteor'; 
import imaps from 'imap-simple'; 

const Storage = new Mongo.Collection('storage'); 

const config = { 
    imap: { 
    … 
    } 
}; 

Meteor.methods({ 
    connect() { 
    console.log('Method called'); 

    imaps.connect(config).then(function(connection) { 
     console.log('Connected'); 

     Storage.insert({ 
     value: 'success' 
     }); 

     console.log('Document inserted'); 
    }) 
    .catch(function(err) { 
     console.error(err); 
    }); 
    } 
}); 

次のメッセージがcatch機能に到着します:

[Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.]

insert電話をラップするには、次のようにすることができます。

Meteor.methods({ 
    connect() { 
    console.log('Method called'); 

    const insert = Meteor.bindEnvironment(function() { 
     Storage.insert({ 
     value: 'success' 
     }); 
    }); 

    imaps.connect(config).then(function(connection) { 
     console.log('Connected'); 
     insert(); 
     console.log('Document inserted'); 
    }) 
    .catch(function(err) { 
     console.error(err); 
    }); 
    } 
}); 

次に、ドキュメントが正常に挿入されます。

関連する問題