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

Getting Response of a function defined in another file in node.js

我有一个套接字函数定义为

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"}

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

您没有得到结果,因为 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);
        ...
    }
}

main module

// 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 中有关一般和具体处理异步调用的信息,并相应地修复代码中的其他位置。