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());
});