Добро пожаловать в асинхронную среду 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(); )
, он может вам понадобиться, когда вы захотите перейти на следующее промежуточное программное обеспечение.