Как обработать множество совпадений условий в nodejs? - PullRequest
0 голосов
/ 03 июня 2019

Я пишу API в Express JS, есть несколько условий, если они совпадают, я пытаюсь ответить на данные.Таким образом, проблема в том, что если два условия совпали, мои коды отвечают два раза, могу ли я перестать отвечать другим условиям после одной отправки?Так как я пришел из PHP фона, логика этого узла js действительно отличается.

Я все еще пытаюсь использовать res.end (), но если другое условие совпадает, оно продолжает отвечать. Я не могу просто написать, еслиоператор условия else, потому что существуют условия другого типа.

Пожалуйста, посмотрите мои коды, если вы можете помочь мне решить эту проблему, очень признателен.

exports.createBooking = (req, res) => {
// Save Order to Database
console.log("Processing func -> Create Booking");
// console.log(req.body);
const business_code = 'Test' + new Date("03/25/2015") + Math.floor(Math.random() * 9999999999999) + 1 ;
const locker_station_id = req.body.locker_station_id || '';
const reference_id = req.body.reference_id || '';
console.log(locker_station_id);
const locker = db.sequelize.query(`SELECT * FROM ems_device where locker_station_id="${locker_station_id}"`,{  plain: true,type: sequelize.QueryTypes.SELECT})
.then(locker => { // data is equal to the result of line 1.
// console.log(locker);
    if(locker){
        // console.log(locker);

        if(locker.status == 0){
            res.status(422).json(ResponseFormat.error(
            'locker_station_offline',
            reference_id,
            422
            ))
        }
        else if(locker.status == 2){
            res.status(422).json(ResponseFormat.error(
            'locker_station_retired',
            reference_id,
            422
            ))
        }
        getLockerboxCategory(req, res);
        const locker_box_category = req.locker_box_category;
        const drawer_resource_info = db.sequelize.query(`SELECT * FROM ems_drawer_resource_info  where device_number="${locker.device_number}" and drawer_status=0`,{ type: sequelize.QueryTypes.SELECT})
        .then(drawer_resource_info => { // data is equal to the result of line 1.
            if(drawer_resource_info.length == 0){
                res.status(422).json(ResponseFormat.error(
                'insufficient_capacity',
                reference_id,
                422
                ))
            }

        });
    }
});
}
function getLockerboxCategory(req, res){
// console.log(req.body.parcel_length);
const parcel_length = req.body.parcel_length || 0;
const parcel_height = req.body.parcel_height || 0;
const parcel_width  = req.body.parcel_width || 0;
const parcel_weight = req.body.parcel_weight || 0;

const small_box_length = 43;
const small_box_height = 8;
const small_box_width = 47;

const medium_box_length = 43;
const medium_box_height = 19;
const medium_box_width = 47;

const large_box_length = 43;
const large_box_height = 28;
const large_box_width = 47;

if(parcel_height < small_box_height && parcel_width < small_box_width && parcel_length < small_box_length){
    // small box
   req.locker_box_category = 3;
   req.locker_box_cost = 1;
}
else if(parcel_height < medium_box_height && parcel_width < medium_box_width && parcel_length < medium_box_length )
{
    //medium box
   req.locker_box_category = 2;
   req.locker_box_cost = 1.5;
}
else if(parcel_height < large_box_height && parcel_width < large_box_width && parcel_length < large_box_length )
{
    //large box
   req.locker_box_category = 1;
   req.ocker_box_cost = 2;
}else{
   res.status(422).json(ResponseFormat.error(
                'parcel_is_too_large',
                req.reference_id||'',
                422
                ));
    res.end();

}

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Добро пожаловать в асинхронную среду NodeJS.При использовании res.json ответ будет записан и поток закончится, res.end() при использовании res.json не используется.Используйте res.json, когда у вас есть все, что вам нужно.

Исходя из вашего кода, вы могли создать ветку else после операторов locker.:

exports.createBooking = (req, res) => {
  // Save Order to Database
  console.log("Processing func -> Create Booking");
  // console.log(req.body);
  const business_code = 'Test' + new Date("03/25/2015") + Math.floor(Math.random() * 9999999999999) + 1;
  const locker_station_id = req.body.locker_station_id || '';
  const reference_id = req.body.reference_id || '';
  console.log(locker_station_id);
  const locker = db.sequelize.query(`SELECT * FROM ems_device where locker_station_id="${locker_station_id}"`, {
      plain: true,
      type: sequelize.QueryTypes.SELECT
    })
    .then(locker => { // data is equal to the result of line 1.
      // console.log(locker);
      if (locker) {
        // console.log(locker);

        if (locker.status == 0) {
          res.status(422).json(ResponseFormat.error(
            'locker_station_offline',
            reference_id,
            422
          ))
        } else if (locker.status == 2) {
          res.status(422).json(ResponseFormat.error(
            'locker_station_retired',
            reference_id,
            422
          ))
        } else {

          let lockerBoxStatus = getLockerboxCategory(req, res); // you need to know the status of this method, go and check getLockerboxCategory

          // the stream will output the JSON if you reach the else branch, but make no mistake, the javascript is not done, the following lines will be evaluated.
          if (lockerBoxStatus) { // if this is 0, then you will not get a write error, because getLockerboxCategory will close the stream.

            const locker_box_category = req.locker_box_category;
            const drawer_resource_info = db.sequelize.query(`SELECT * FROM ems_drawer_resource_info  where device_number="${locker.device_number}" and drawer_status=0`, {
                type: sequelize.QueryTypes.SELECT
              })
              .then(drawer_resource_info => { // data is equal to the result of line 1.
                if (drawer_resource_info.length == 0) {
                  res.status(422).json(ResponseFormat.error(
                    'insufficient_capacity',
                    reference_id,
                    422
                  ))
                }

              });

          }


        }

      }
    });
}

function getLockerboxCategory(req, res) {
  // console.log(req.body.parcel_length);
  let status = 1; // assuming 1 by default
  const parcel_length = req.body.parcel_length || 0;
  const parcel_height = req.body.parcel_height || 0;
  const parcel_width = req.body.parcel_width || 0;
  const parcel_weight = req.body.parcel_weight || 0;

  const small_box_length = 43;
  const small_box_height = 8;
  const small_box_width = 47;

  const medium_box_length = 43;
  const medium_box_height = 19;
  const medium_box_width = 47;

  const large_box_length = 43;
  const large_box_height = 28;
  const large_box_width = 47;

  if (parcel_height < small_box_height && parcel_width < small_box_width && parcel_length < small_box_length) {
    // small box
    req.locker_box_category = 3;
    req.locker_box_cost = 1;
  } else if (parcel_height < medium_box_height && parcel_width < medium_box_width && parcel_length < medium_box_length) {
    //medium box
    req.locker_box_category = 2;
    req.locker_box_cost = 1.5;
  } else if (parcel_height < large_box_height && parcel_width < large_box_width && parcel_length < large_box_length) {
    //large box
    req.locker_box_category = 1;
    req.ocker_box_cost = 2;
  } else {
    status = 0;
    res.status(422).json(ResponseFormat.error(
      'parcel_is_too_large',
      req.reference_id || '',
      422
    ));
    //res.end(); // you don't need this `.json` will output+end the stream

  }
  return status;
}

PS: убедитесь, что все ваши операторы охватываются res.json или res.end(), где вы считаете целесообразным завершать поток, иначе веб-сервер будет зависать.И прочитайте о параметре next из промежуточного программного обеспечения app.use((req, res, next)=> next(); ), он может вам понадобиться, когда вы захотите перейти на следующее промежуточное программное обеспечение.

0 голосов
/ 03 июня 2019

Не обращая особого внимания на ваш код, предложите оператор switch.Это позволит вам break; из утверждения, когда условие выполнено.Они должны работать так же, как в PHP, но вот документы на случай https://www.w3schools.com/js/js_switch.asp.Если переключатель не работает, вы можете просто выйти из функции, как только условие будет выполнено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...