Node.js 节点js twilio发送sms不';行不通
我有这个功能发送短信Node.js 节点js twilio发送sms不';行不通,node.js,twilio,twilio-api,twilio-twiml,Node.js,Twilio,Twilio Api,Twilio Twiml,我有这个功能发送短信 var twiml = new MessagingResponse(); function sendsms() { twiml.message("aaa"); console.log(twiml.toString()); } 但是当我在User.findone中调用这个函数时 User.findOne({}, function(err, user) {
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' });
}
});
这是获取和重播sms的路径
router.post('/getSMS', function(req, res) {
require('../config/getAndReplay')(req, res);
});
这里是Twilio开发者福音传道者 代码中的问题是,您混合了同步和异步代码
User.findOne
是一个异步调用,因此在结果回调中调用getandreplay()
函数意味着它将在路由中的响应完成后发生
我建议您从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()
的回调函数中的res.end
让我知道这是否有帮助。你能分享更多不起作用的代码吗。当你说“我在User.findone内部调用这个函数,它不工作”时,你怎么调用它?你能展示一下代码吗?我假设这是一个express应用程序中的代码,或者类似的,响应传入请求的代码。你能分享整个路线/行动吗?我添加了路线/行动谢谢你,以及。/config/sendSMS
和。/config/getAndReplay
内部是什么?发送工作正常getAndReplay在调用内部用户的sendSMS时在我的控制台顶部包含代码。findone它成功地记录了twimltostring,但在调用外部用户的sendSMS时没有发送sms。findone它工作正常,它也正常发送短信成功
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());
});