2017-07-13 12 views
0

私はNode.js/Express.jsプロジェクトを持っています。2番目の呼び出しでvCard.jsが関数にならない

私が持っている三つのないエンドポイント: 1)それはの.vcfファイルを生成するvCard.jsを使用し 2)電子メール受信者、それはとして受信者を追加するの.vcfファイル 3)へのリンクユーザープロファイルへの連絡

何らかの理由で、私がこのエンドポイントを最初に呼び出すと、それはすべてうまく処理されます。しかしそれ以降の呼び出しでは、vCardが関数ではないというエラーが生成されます。

以下はExpressエンドポイントの簡略化されたバージョンです。私は基本的に関数に渡される変数をインスタンス化するコードのブロックを取り除きました。

私は誰かが問題の原因となっている可能性のあるフロー内の何かを見ることができると考えています。

私はコード全体を投稿することができますが、私は人が見ることが少し面倒かもしれないと思って、これを最初に試してみると思いました。

ここでは、エンドポイントの:

var express = require('express'); 
var router = express.Router(); 
var Card = require('../models/cards'); 
var Hold = require('../models/hold'); 
var Profile = require('../models/profile'); 
var vCard = require('vcards-js'); 
var GuidGen = require('./helpers/generate_guid'); 
var sendmail = require('./helpers/post_office'); 
var constants = require('./helpers/constants'); 

router.route('/invite') 

.put(function(req, res){ 

    vCard = vCard(); 

    //VARIABLES PASSED TO VCARD HERE 

    // REMOVED FIELDS FOR VCARD FOR SIMPLICITY. HERE IS AN EXAMPLE OF A FIELD: vCard.[FIELD] = req.body.[PARAM]; 


    //FIRST ACTION: SAVE VCARD 
    vCard.saveToFile('./vcards/' + req.body.invited_first_name + req.body.invited_last_name + req.body.owner_id + '.vcf'); 


    //SECOND ACTION: SEND EMAIL WITH VCARD 

//FOLLOWING ACTION PASSES THE ABOVE PARAMS AND SENDS EMAIL VIA HELPER 
    sendmail.mailsend(emailSender, emailRecipient, emailSubject, emailBody); 


    //THIRD ACTION: SAVE CONTACT TO USER PROFILE 
    Profile.findOne({'contacts.emails.email_address':req.body.invited_email}, function(err, profile){ 
    if(err) 
     console.log('Error in looking for profile.'); 

    if(profile){ 

     //I REMOVED THE CODE BLOCK THAT SETS UP SAVING THE PROFILE FOR SIMPLICITY 

      profile.save(function(err){ 
      if(err) 
       res.send(err); 
      res.json(profile); 
      }); 

    } else { 


     //REMOVED CODE FOR SETTING UP UPDATING CONTACTS FOR SIMPLICITY 


     var contacts = { 
      //CODE FOR CONTATACTS REMOVED FOR SIMPLICITY 
     }; 

     Profile.findOneAndUpdate({ 
      owner_id: req.body.owner_id 
     }, { 
      $push: { 
       contacts: contacts 
      } 
     }, { 
      new: true 
     }, (err, profile) => { 
      if (err) { 
       return res.send(err); 
      } 
      return res.json(profile); 
     }); 

     } 

    }) 


}) 




module.exports = router; 

答えて

1

たび.putが呼び出されるので、それはグローバルvCardリファレンスを参照しています。最初の行では、グローバルvCardをvCardの関数実行に設定しました。これは間違いです。 2番目のputに戻ると、グローバルvCardが参照されますが、今回は最初の呼び出しでそのように設定されているため、オブジェクトです。

これはちょっと混乱しています。

  1. vCardは、モジュールvcards-jsへの参照です。
  2. vCardは関数です。
  3. vCardは、vCard()から返されたオブジェクトです。
  4. 元の呼び出しで返されたオブジェクトの関数呼び出しをvCardで呼び出しようとしました。この場合

、あなたは何か他のものにvCardの名前を変更、またはあなたのput方法のvCard外の新しい宣言を掲げなければならないのいずれか。

+0

ありがとう、Wilson! – cnak2

関連する問題