获取node.js中另一个文件中定义的函数的响应

时间:2015-10-26 08:57:53

标签: node.js socket.io

我有一个定义为

的套接字函数
var funcs = require('./funcs');

    socket.on(EVENT_ACCEPT_ORDER, function(data, callback)
    {                     
       data = JSON.parse(data);
       var bookingId  = data.bookingId;
       var userId     = data.userId;

       console.log("Accepting booking...." + bookingId);
       var query = "UPDATE bookings SET bookingStatus = " + BOOKING_STATUS_ACCEPTED + " WHERE id = " + bookingId + " AND bookingStatus = " + BOOKING_STATUS_IN_QUEUE;

    con.query(query, function(err, rows,fields)
    {
        if(err)
        {
               console.log("mysql query error");
        }
        else
        {
            if(rows.changedRows > 0)
            {
               var indexOfUser = usersList.indexOf(userId);
               if(indexOfUser > -1)
                {
                   userSockets[indexOfUser].emit(EVENT_USER_ORDER_ACCEPTED);
               }

               callback({"message": "Success","error":false, "booking": funcs.getBooking(con, bookingId)});
       }
      else
          callback({"message": "Success","error":true});                                            
    }
    });                               
    }); 


Funcs is defined as

    module.exports = {

    "getBooking": function (con, bookingId)
                 {  
                    var query = "SELECT * FROM bookings WHERE id = " + bookingId + " LIMIT 1";
                    con.query(query, function(err, rows,fields)
                    {
                        if(err) 
                        {
                            console.log("mysql query error");
                        }
                        else if (rows.length == 1)
                        {
                            var booking = rows[0];
                            var userId = rows[0]['userId'];
                            var query = "SELECT id, name, phone, imagePath FROM users WHERE id = " + userId + " LIMIT 1";
                            con.query(query, function(err, rows,fields)
                            {
                                if(err) 
                                {
                                    console.log("mysql query error");
                                }
                                else if (rows.length == 1)
                                {
                                    booking['user'] = rows[0];
                                    return booking;
                                }
                            });
                        }
                    });
                }
    }

除了

之外,一切正常
callback({"message": "Success","error":false, "booking": funcs.getBooking(con, bookingId)});

在这个功能而不是预订,我只是

{"error":false,"message":"Success"}

为什么我没有收到预订功能结果?

1 个答案:

答案 0 :(得分:1)

您没有收到结果,因为con.query中的回调函数的结果未返回给getBooking的调用者。它是异步模式,您无法正确处理。

它应该工作的方式是getBooking得到一个额外的参数:一个在数据可用时被调用的函数(在对con.query的内部异步调用中)。然后由调用者提供这样的功能,并且在此功能中,您可以使用数据执行任何操作:

  

funcs.js

"getBooking": function (con, bookingId, callback) {
    ...
    con.query(query, function(err, rows,fields) {
        ...
        // instead of return booking do
        callback(err, booking);
        ...
    }
}
  

主要模块

// instead of 
callback({"message": "Success","error":false, "booking": funcs.getBooking(con, bookingId)});
// do
funcs.getBooking(con, bookingId, function(err, booking) {
    callback({"message": "Success","error":false, "booking": booking});
});

我担心这不是您代码中唯一的问题,但这应该是第一个修复的问题。进一步阅读有关处理异步调用的信息,特别是在node.js中,并相应地修复代码中的其他位置。