Fix crash in NBI when device not found

This commit is contained in:
Zaid Abdulla committed 2021-08-02 14:04:06 -07:00
1 parent be90214bf9
commit cce85e48ed
1 file changed
+37 -11
+37 -11
View File
@@ -30,6 +30,7 @@ import * as cache from "./cache";
import { version as VERSION } from "../package.json"; import { version as VERSION } from "../package.json";
import { ping } from "./ping"; import { ping } from "./ping";
import * as logger from "./logger"; import * as logger from "./logger";
import { flattenDevice } from "./mongodb-functions";
const DEVICE_TASKS_REGEX = /^\/devices\/([a-zA-Z0-9\-_%]+)\/tasks\/?$/; const DEVICE_TASKS_REGEX = /^\/devices\/([a-zA-Z0-9\-_%]+)\/tasks\/?$/;
const TASKS_REGEX = /^\/tasks\/([a-zA-Z0-9\-_%]+)(\/[a-zA-Z_]*)?$/; const TASKS_REGEX = /^\/tasks\/([a-zA-Z0-9\-_%]+)(\/[a-zA-Z_]*)?$/;
@@ -402,9 +403,18 @@ export function listener(
if (body.length) { if (body.length) {
const task = JSON.parse(body.toString()); const task = JSON.parse(body.toString());
task.device = deviceId; task.device = deviceId;
apiFunctions collections.devices
.insertTasks(task) .findOne({ _id: deviceId })
.then(async () => { .then(async (dev) => {
if (!dev) {
response.writeHead(404);
response.end("No such device");
return;
}
const device = flattenDevice(dev);
await apiFunctions.insertTasks(task);
const lastInform = Date.now(); const lastInform = Date.now();
const socketTimeout: number = request.socket["timeout"]; const socketTimeout: number = request.socket["timeout"];
@@ -435,7 +445,10 @@ export function listener(
return; return;
} }
const status = await apiFunctions.connectionRequest(deviceId); const status = await apiFunctions.connectionRequest(
deviceId,
device
);
if (status) { if (status) {
if (socketTimeout) request.socket.setTimeout(socketTimeout); if (socketTimeout) request.socket.setTimeout(socketTimeout);
@@ -518,15 +531,28 @@ export function listener(
}); });
} else if (urlParts.query.connection_request != null) { } else if (urlParts.query.connection_request != null) {
// No task, send connection request only // No task, send connection request only
apiFunctions collections.devices
.connectionRequest(deviceId) .findOne({ _id: deviceId })
.then(() => { .then(async (dev) => {
response.writeHead(200); if (!dev) {
response.end(); response.writeHead(404);
response.end("No such device");
return;
}
return apiFunctions.connectionRequest(deviceId).then((status) => {
if (status) {
response.writeHead(504, status);
response.end(status);
return;
}
response.writeHead(200);
response.end();
});
}) })
.catch((err) => { .catch((err) => {
response.writeHead(504); setTimeout(() => {
response.end(`${err.name}: ${err.message}`); throwError(err, response);
});
}); });
} else { } else {
response.writeHead(400); response.writeHead(400);