【问题标题】:Getting vCard.js not a function on second call在第二次调用时获取 vCard.js 不是函数
【发布时间】:2017-07-13 02:21:10
【问题描述】:

我有一个 Node.js/Express.js 项目。

我有一个端点可以做三件事: 1) 它使用 vCard.js 生成一个 .vcf 文件 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;

【问题讨论】:

    标签: javascript node.js express vcf-vcard


    【解决方案1】:

    这是因为每次调用 .put 时,它都会引用全局 vCard 引用。在第一行,您将全局 vCard 设置为 vCard 的函数执行 - 那是您的错误。当您回到第二个put 时,您引用了全局vCard,但这一次,它是一个对象,因为您在第一次调用时将其设置为对象。

    这有点令人困惑,让我分解一下。

    1. vCard 是对模块vcards-js 的引用。
    2. vCard 是一个函数。
    3. vCard 是一个从vCard() 返回的对象。
    4. 您试图对一个对象调用函数调用,该函数调用从 vCard 的原始调用返回。

    在这种情况下,您应该将 vCard 重命名为其他名称,或者在您的 put 方法之外提升 vCard 的新声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      相关资源
      最近更新 更多