在第二次调用时获取 vCard.js 不是函数
Getting vCard.js not a function on second call
我有一个 Node.js/Express.js 项目。
我有一个端点可以做三件事:
1) 它使用 vCard.js 生成.vcf 文件
2) 它通过电子邮件向收件人发送 link 到 .vcf 文件
3) 它将收件人作为联系人添加到用户个人资料
出于某种原因,当我第一次调用此端点时,它处理一切都很好。但是此后的任何调用都会生成错误,指出 vCard 不是函数。
下面是 Express 端点的简化版本。我删除了基本上实例化传递给函数的变量的代码块。
我希望有人能够在流程中看到可能导致问题的原因。
我可以 post 完整的代码,但我认为这对人们来说可能有点麻烦,我想我会先试一试。
这是终点:
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;
那是因为每次调用 .put 时,它都会引用全局 vCard
引用。在第一行,您将全局 vCard 设置为 vCard 的函数执行 - 那是您的错误。当你回到第二个 put
时,你引用了全局 vCard
,但这次,它是一个对象,因为你在第一次调用时就这样设置了它。
这有点令人困惑,让我分解一下。
- vCard 是对模块
vcards-js
. 的引用
- vCard 是一个函数。
- vCard 是
vCard()
中带有 return 的对象。
- 您试图调用对象上的函数调用,该对象是 returned 形成
vCard
的原始调用。
在这种情况下,您应该将 vCard 重命名为其他名称,或者将 vCard
的新声明提升到 put
方法之外。
我有一个 Node.js/Express.js 项目。
我有一个端点可以做三件事: 1) 它使用 vCard.js 生成.vcf 文件 2) 它通过电子邮件向收件人发送 link 到 .vcf 文件 3) 它将收件人作为联系人添加到用户个人资料
出于某种原因,当我第一次调用此端点时,它处理一切都很好。但是此后的任何调用都会生成错误,指出 vCard 不是函数。
下面是 Express 端点的简化版本。我删除了基本上实例化传递给函数的变量的代码块。
我希望有人能够在流程中看到可能导致问题的原因。
我可以 post 完整的代码,但我认为这对人们来说可能有点麻烦,我想我会先试一试。
这是终点:
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;
那是因为每次调用 .put 时,它都会引用全局 vCard
引用。在第一行,您将全局 vCard 设置为 vCard 的函数执行 - 那是您的错误。当你回到第二个 put
时,你引用了全局 vCard
,但这次,它是一个对象,因为你在第一次调用时就这样设置了它。
这有点令人困惑,让我分解一下。
- vCard 是对模块
vcards-js
. 的引用
- vCard 是一个函数。
- vCard 是
vCard()
中带有 return 的对象。 - 您试图调用对象上的函数调用,该对象是 returned 形成
vCard
的原始调用。
在这种情况下,您应该将 vCard 重命名为其他名称,或者将 vCard
的新声明提升到 put
方法之外。