2016-07-28 137 views
2

我正在使用imap-simple NPM軟件包來檢查電子郵件,並且無法正確使插入操作。無法插入到使用流星1.3的NPM中進行採集

我已經閱讀完此頁面:https://guide.meteor.com/using-npm-packages.html#async-callbacks - 我已經嘗試過這些建議,但是他們都沒有工作!

我也簡化了代碼,試圖讓它工作,但仍然沒有運氣。

這個問題應該很容易重現 - 流星npm安裝imap-simple,將上面的代碼放到服務器上,添加一些電子郵件憑據,然後調用方法。

這裏是我的代碼:

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工作。插入不起作用。沒有錯誤,沒有console.log後插入,沒有。

我已經嘗試了在指南中推薦的兩種策略,都沒有工作。

+0

什麼是TempEmailCollection? – Darren

+0

@Darren一個Mongo收集專門用於包含郵件信息。通常在流星的任何地方,.insert都適用於集合。但不是在NPM模塊上。而傳統的解決方法並不適合我。 –

+0

您需要顯示其代碼;這整個問題似乎是相關的,而不是電子郵件(你說的工作) – Darren

回答

0

問題是你正在異步調用一個叫做Promise處理程序的Meteor函數。然而,在服務器上調用的所有Meteor函數都必須在光纖中運行。 流星實際上在這種情況下拋出一個錯誤,但是你忽略它,因爲你沒有爲Promises指定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); 
    }); 
    } 
}); 

然後按預期插入文檔。