节点 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

如果这有帮助,请告诉我。