It seems you are trying to use:
let x = poses[0].keypoints.length.nose
But my understanding is that the results come back in the following form (there is no “.nose” on array length) instead if you want nose you would simply refer to: poses[0].keypoints[0].x and poses[0].keypoints[0].y as described below.
[
  {
    score: 0.8,
    keypoints: [
      {x: 230, y: 220, score: 0.9, name: "nose"},
      {x: 212, y: 190, score: 0.8, name: "left_eye"},
      ...
    ]
  }
]

So using the names of the points (or the array offset as shown in the image below) you can plot them on the canvas as normal.  If you draw out the points as dots first you can figure out which 2 points you want to connect eg left_shoulder to right_shoulder to get a line across the top of the body for example. It is up to you to decide what lines you want to draw though. You can use this diagram as reference:

68747470733a2f2f73746f726167652e676f6f676c65617069732e636f6d2f6d6f76656e65742f636f636f2d6b6579706f696e74732d3530302e706e67500×511 37.1 KB

Which was taken from the docs available here: tfjs-models/pose-detection at master · tensorflow/tfjs-models · GitHub 14
Hence to draw a line from top left shoulder to top right shoulder, you would need to take the array elements 5 and 6 and draw a line between those 2 xy co-ordinates. You can add logic to check confidence score if that is important to you to ommit lines that do not have confidence > SOME_THRESHOLD for both points.