我有这个函数发送短信
var twiml = new MessagingResponse();
function sendsms() {
twiml.message("aaa");
console.log(twiml.toString());
}
但是当我在User.findone
中调用此函数时 User.findOne({}, function(err, user) {
if (condition) {
sendsms();
}
})
它成功记录了twiml.toString 但短信没有发送 当我在user.findOne外面打电话时,短信成功发送
sendsms()
这是发送短信的路线
router.post('/sendSMS', function(req, res) {
var phone = req.body.phone;
User.findOne({}, function(err, user) {
require('../config/sendSMS')(user, phone);
res.status(200).json({ success: true, message: 'message sent successfully' });
}
});
这是获取和重播短信的途径
router.post('/getSMS', function(req, res) {
require('../config/getAndReplay')(req, res);
});
答案 0 :(得分:1)
Twilio开发者传道者在这里。
您的代码中的问题是您正在混合同步和异步代码。
User.findOne
是异步调用,因此在结果回调中调用getandreplay()
函数意味着它会在您的路径中完成响应后发生。
我建议您return
要从getandreplay()
回复的邮件,并使用它来形成对传入请求的响应。像这样:
function getandreplay(node) {
if (node.outs.length > 0) {
if (node.outs.includes(req.body.Body.toLowerCase())) {
for (var i = 0; i < node.output.length; i++) {
var el = node.output[i];
if (req.body.Body.toLowerCase() == el[0]) {
req.session.lastnode = getnode(el[1]);
if (getnode(el[1]).outs.length == 0) {
req.session.destroy();
User.findOneAndUpdate({}, { $push: { users: userPhone } }, { safe: true, upsert: true }, function(user, err) {});
}
return getnode(el[1]).msg;
}
}
} else {
return node.msg
}
}
}
然后,当您致电User.findOne()
时,您会从getandreplay()
获得结果并将其作为回复发回:
User.findOne({}, function(err, user) {
if (!user.users.includes(userPhone)) {
twiml.message(getandreplay(mynode));
}
res.writeHead(200, { 'Content-Type': 'text/xml' });
res.end(twiml.toString());
});
请注意,我在res.end
的回调函数中调用User.findOne()
。
让我知道这是否有帮助。