节点 js twilio 发送短信不起作用
node js twilio send sms doesn't work
我有这个功能发送短信
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);
});
这里是 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());
});
请注意,这里我在 User.findOne()
的回调函数中调用 res.end
。
如果这有帮助,请告诉我。
我有这个功能发送短信
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
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);
});
这里是 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());
});
请注意,这里我在 User.findOne()
的回调函数中调用 res.end
。
如果这有帮助,请告诉我。