簡體   English   中英

我陷入了回調地獄,誰能建議最好的方法來完成這項工作?

[英]I am stuck in callback hell.Can anyone suggest best method to do the job?

提取卡車位置后,我正在為卡車制作類似於Uber的應用程序,我必須找到負載已過帳的匹配卡車。 但是我陷入了回調地獄。 能否請您提及同時有效地完成工作和獲得良好性能的最佳方法。我正在express.js中創建后端,並使用了兩個數據庫Mysql和MongoDB。任何幫助都非常有用。

        const express = require('express');
    const bodyParser = require('body-parser');
    const mysql = require('mysql');
    const request = require('request');
    const bcrypt = require('bcrypt');
    const cors = require('cors');
    const moment = require('moment');
    const mongoose = require('mongoose');

    mongoose.connect("mongodb://localhost/Location");
    const mongoConn = mongoose.connection;

    mongoConn.on('connected',function () {
        console.log("mongo connected");
    });
    mongoConn.on('disconnected',function () {
        console.log("mongo disconnected");
    });
    mongoConn.on('error', console.error.bind(console, 'connection error:'));
    mongoConn.once('open', function() {
        console.log("mongo connection opened");
    });
    const LocationSchema = mongoose.Schema({
        truck_id:Number,
        user_id:Number,
        longitude:Number,
        latitude:Number,
        created_at:Number,
        status:Number
    });
    const Location = mongoose.model('Location',LocationSchema);
    const app = express();
    app.listen(3002  ,()=> {
        console.log('server is listening at port 3002');
    });
    app.use(cors());

    app.use(function (req, res, next) {
        res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
        next();
    });
    app.use( bodyParser.json() );       // to support JSON-encoded bodies
    app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
        extended: true
    }));

    const db = mysql.createConnection({
        host     : '127.0.0.1',
        user     : 'root',
        password : '',
        database : 'truck'
    });

    db.connect(function(err) {
        if (err) {
            console.error('error connecting: ' + err.stack);
            return;
        }
        console.log('connected as id ' + db.threadId);
    });

    app.get('/view-trucks',verifyUser,(req,res)=>{

        let truck_ids = [];
        let truck_locations;
        let load_id = req.query.id;
        let sql = 'SELECT * FROM tr_post_load WHERE id = '+ db.escape(load_id);
        db.query(sql,function (error, results, fields) {
            if(error){console.log('error is '+error);res.status(200).send({status:'error'});throw error;}
            if(results.length > 0){
                let load_from_lat = results[0].from_lat;
                let load_from_long = results[0].from_long;
                let load_to_lat = results[0].to_lat;
                let load_to_long = results[0].to_long;

                let find_Trucks_sql =  'SELECT * FROM tr_truck WHERE user_id != '+results[0].user_id+' AND truck_capacity_id = ? AND body_type_id = ? AND truck_length_id = ?';

                db.query(find_Trucks_sql,[results[0].truck_capacity_id,results[0].body_type_id,results[0].truck_length_id],function (error, results, fields) {

                    if (error) {console.log('error is ' + error);res.status(200).send({status: 'error'});throw error;}
                    if(results.length > 0) {
                        for (let a = 0; a <= results.length; a++) {
                            if(typeof results[a] === 'object'){
                                truck_ids.push(results[a].id);
                            }
                        }
                        console.log("truck ids are "+truck_ids);
                        if(truck_ids.length > 0){
                            // fetch location from mongodb
                            let locationQuery = Location.find({truck_id:{$in:truck_ids},status:1}).lean();
                            locationQuery.exec(function (err,locations) {
                                if (err){console.log("mongo error is "+err);res.status(200).send({status: 'error'});}
                                truck_locations = locations;
                                if(truck_locations.length > 0) {
                                    console.log("truck length ay 847 is " + truck_locations.length);
                                    for (let i = 0; i <= truck_locations.length; i++) {

                                        if (typeof truck_locations[i] === "object") {
                                            console.log("my truck value at line 849 is " + truck_locations[i]);

                                            let diff = findTimeDiff(truck_locations[i].created_at);
                                            console.log("time difference is " + diff);
                                            if (diff) {
                                                if (truck_locations[i].latitude !== null && truck_locations[i].longitude !== null) {
                                                    let dist = distance(load_from_lat, load_from_long, truck_locations[i].latitude, truck_locations[i].longitude);
                                                    if (dist !== null) {
                                                        console.log("if dist truck id is  " + truck_locations[i].truck_id);
                                                        let truck_routes_sql = "SELECT * FROM tr_route WHERE truck_id = " + db.escape(truck_locations[i].truck_id);
                                                        db.query(truck_routes_sql, function (err, truck_routes, fields) {
                                                            if (err) {console.log("error while fetching truck routes is " + err);throw err;}

                                                            console.log("truck routed are " + JSON.stringify(truck_routes));
                                                            console.log("my truck value at line 868 is " + truck_locations[i]);
                                                            if (truck_routes.length > 0) {
                                                                for (let j = 0; j <= truck_routes.length; j++) {
                                                                    console.log("current trucks route is " + JSON.stringify(truck_routes[j]));
                                                                    if (typeof truck_routes[j] === "object" && truck_routes[j].from_lat !== null && truck_routes[j].from_long !== null) {
                                                                        let route_distance_from = distance(load_to_lat, load_to_long, truck_routes[j].from_lat, truck_routes[j].from_long);
                                                                        let route_ditance_to = distance(load_to_lat, load_to_long, truck_routes[j].to_lat, truck_routes[j].to_long);
                                                                        if (route_distance_from !== null || route_ditance_to !== null) {
                                                                            console.log("i am in truck route distance at line 869 and truck is " + JSON.stringify(truck_locations[i]));
                                                                            let find_truck_sql = "SELECT * FROM tr_truck WHERE id = " + db.escape(truck_routes[j].truck_id);
                                                                            db.query(find_truck_sql, function (error, truck, fields) {
                                                                                if (err) {
                                                                                    console.log("error while fetching truck routes is " + err);
                                                                                    throw err;
                                                                                }
                                                                                // console.log("truck on line 874 is  "+JSON.stringify(truck[0])+"and truck length is "+truck.length);
                                                                                if (truck.length > 0 && typeof truck[0] !== "undefined") {
                                                                                    console.log("final truck found  on line 884 is  " + JSON.stringify(truck[0]));
                                                                                    console.log("885 mytruck at position "+i+" is "+JSON.stringify(truck_locations[i]));

                                                                                    truck_locations[i].truck = truck[0];

                                                                                    console.log("after adding object and truck is " + JSON.stringify(truck_locations));
                                                                                }
                                                                            });
                                                                        } else {
                                                                            // mytrucks.splice(i,1);
                                                                        }
                                                                    }
                                                                }
                                                            } else {
                                                                // truck_locations.splice(i, 1);
                                                                console.log("i is " + i + " no routes found and my_trucks are now  " + JSON.stringify(truck_locations));
                                                            }
                                                        });
                                                    } else {
                                                        //  mytrucks.splice(i,1);
                                                    }
                                                }
                                            } else {
                                                // mytrucks.splice(i,1);
                                            }
                                        }
                                    }
                                }
                                res.status(200).send(truck_locations);
                                //end of location
                            });
                        }else{
                            res.status(200).send("no truck found");
                        }
                    }else{
                        res.status(200).send("no truck found");
                    }
                });
            }else{
                res.status(200).send({status:'notExist'});
            }

        });
    });

    function distance(lat1, lon1, lat2, lon2) {
        let p = 0.017453292519943295;    // Math.PI / 180
        let c = Math.cos;
        let a = 0.5 - c((lat2 - lat1) * p)/2 +
            c(lat1 * p) * c(lat2 * p) *
            (1 - c((lon2 - lon1) * p))/2;

        return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km
    }

    function findTimeDiff(truck_created_at) {
        let truck_time = truck_created_at;
        truck_time = moment(truck_time);
        let nowTime = moment().utcOffset("+05:30").toDate().getTime();
        nowTime = moment(nowTime);
        return nowTime.diff(truck_time, "minutes");
    }

基於@dvsoukup的評論,您應該首先閱讀有關JavaScript promises的這篇文章 引入了承諾,以緩解此回調地獄,並做到這一點很棒。

然后,如果您使用的是Nodejs 8或更高版本,則應調查async / await 在查看異步/等待之前,請確保對Promises沒問題,因為它在后台使用了Promise。 您可以跳過此步驟,直接進入異步/等待狀態,但最終您會發現自己回到了我的想象。

這兩種方法都應該停止回調地獄,並使代碼更具可讀性。

有一個包promise-mysql ,其中已經用bluebird promise包裝了mysql包。

這將允許您使用相同的mysql函數,但是您可以像這樣使用返回的Promise(並最終使用async / await )來代替回調函數。

async handleRequest(req, res, next) {
  try {
    const loadQuery = `SELECT * FROM tr_post_load WHERE id = ${db.escape(load_id)}`;
    const loads = await db.query(sqlQuery);
    if (loads.length === 0) {
      throw new Error('Load not found');
    }
    const load = loads[0];
    const load_from_lat = load.from_lat;
    const load_from_long = load.from_long;
    const load_to_lat = load.to_lat;
    const load_to_long = load.to_long;

    const truckQuery = `SELECT * FROM tr_truck WHERE user_id != ${load.user_id} AND truck_capacity_id = ? AND body_type_id = ? AND truck_length_id = ?`;
    const trucks = await db.query(
      truckQuery,
      [ load.truck_capacity_id, load.body_type_id, load.truck_length_id ]
    );

    if(trucks.length > 0) {
      for (let a = 0; a <= trucks.length; a++) {
        if(typeof trucks[a] === 'object') {
          truck_ids.push(trucks[a].id);
        }
    }

    ...
    // more code and queries to follow
    ...
  } catch (error) {
    console.log('error is '+error);
    res.status(200).send({status:'error'});
    throw error;
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM