├── .gitignore ├── index.js ├── package-lock.json ├── package.json └── queries.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const bodyParser = require('body-parser'); 3 | const app = express(); 4 | const port = 3000; 5 | 6 | const db = require('./queries'); 7 | 8 | app.use(bodyParser.json()); 9 | app.use( 10 | bodyParser.urlencoded({ 11 | extended: true, 12 | }) 13 | ); 14 | 15 | app.get('/', (request, response) => { 16 | response.json({ info: 'Node.js, Express, and Postgres API' }); 17 | }); 18 | 19 | app.get('/users', db.getUsers); 20 | app.get('/users/:id', db.getUserById); 21 | app.post('/users', db.createUser); 22 | app.put('/users/:id', db.updateUser); 23 | app.delete('/users/:id', db.deleteUser); 24 | 25 | app.listen(port, () => { 26 | console.log(`App running on port ${port}.`); 27 | }); 28 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "postgres-node", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.8", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 10 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 11 | "requires": { 12 | "mime-types": "~2.1.34", 13 | "negotiator": "0.6.3" 14 | } 15 | }, 16 | "array-flatten": { 17 | "version": "1.1.1", 18 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 19 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 20 | }, 21 | "body-parser": { 22 | "version": "1.20.0", 23 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", 24 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", 25 | "requires": { 26 | "bytes": "3.1.2", 27 | "content-type": "~1.0.4", 28 | "debug": "2.6.9", 29 | "depd": "2.0.0", 30 | "destroy": "1.2.0", 31 | "http-errors": "2.0.0", 32 | "iconv-lite": "0.4.24", 33 | "on-finished": "2.4.1", 34 | "qs": "6.10.3", 35 | "raw-body": "2.5.1", 36 | "type-is": "~1.6.18", 37 | "unpipe": "1.0.0" 38 | } 39 | }, 40 | "buffer-writer": { 41 | "version": "2.0.0", 42 | "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", 43 | "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" 44 | }, 45 | "bytes": { 46 | "version": "3.1.2", 47 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 48 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 49 | }, 50 | "call-bind": { 51 | "version": "1.0.2", 52 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 53 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 54 | "requires": { 55 | "function-bind": "^1.1.1", 56 | "get-intrinsic": "^1.0.2" 57 | } 58 | }, 59 | "content-disposition": { 60 | "version": "0.5.4", 61 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 62 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 63 | "requires": { 64 | "safe-buffer": "5.2.1" 65 | } 66 | }, 67 | "content-type": { 68 | "version": "1.0.4", 69 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 70 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 71 | }, 72 | "cookie": { 73 | "version": "0.5.0", 74 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 75 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 76 | }, 77 | "cookie-signature": { 78 | "version": "1.0.6", 79 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 80 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 81 | }, 82 | "debug": { 83 | "version": "2.6.9", 84 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 85 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 86 | "requires": { 87 | "ms": "2.0.0" 88 | } 89 | }, 90 | "depd": { 91 | "version": "2.0.0", 92 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 93 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 94 | }, 95 | "destroy": { 96 | "version": "1.2.0", 97 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 98 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 99 | }, 100 | "ee-first": { 101 | "version": "1.1.1", 102 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 103 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 104 | }, 105 | "encodeurl": { 106 | "version": "1.0.2", 107 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 108 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 109 | }, 110 | "escape-html": { 111 | "version": "1.0.3", 112 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 113 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 114 | }, 115 | "etag": { 116 | "version": "1.8.1", 117 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 118 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 119 | }, 120 | "express": { 121 | "version": "4.18.1", 122 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", 123 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", 124 | "requires": { 125 | "accepts": "~1.3.8", 126 | "array-flatten": "1.1.1", 127 | "body-parser": "1.20.0", 128 | "content-disposition": "0.5.4", 129 | "content-type": "~1.0.4", 130 | "cookie": "0.5.0", 131 | "cookie-signature": "1.0.6", 132 | "debug": "2.6.9", 133 | "depd": "2.0.0", 134 | "encodeurl": "~1.0.2", 135 | "escape-html": "~1.0.3", 136 | "etag": "~1.8.1", 137 | "finalhandler": "1.2.0", 138 | "fresh": "0.5.2", 139 | "http-errors": "2.0.0", 140 | "merge-descriptors": "1.0.1", 141 | "methods": "~1.1.2", 142 | "on-finished": "2.4.1", 143 | "parseurl": "~1.3.3", 144 | "path-to-regexp": "0.1.7", 145 | "proxy-addr": "~2.0.7", 146 | "qs": "6.10.3", 147 | "range-parser": "~1.2.1", 148 | "safe-buffer": "5.2.1", 149 | "send": "0.18.0", 150 | "serve-static": "1.15.0", 151 | "setprototypeof": "1.2.0", 152 | "statuses": "2.0.1", 153 | "type-is": "~1.6.18", 154 | "utils-merge": "1.0.1", 155 | "vary": "~1.1.2" 156 | } 157 | }, 158 | "finalhandler": { 159 | "version": "1.2.0", 160 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 161 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 162 | "requires": { 163 | "debug": "2.6.9", 164 | "encodeurl": "~1.0.2", 165 | "escape-html": "~1.0.3", 166 | "on-finished": "2.4.1", 167 | "parseurl": "~1.3.3", 168 | "statuses": "2.0.1", 169 | "unpipe": "~1.0.0" 170 | } 171 | }, 172 | "forwarded": { 173 | "version": "0.2.0", 174 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 175 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 176 | }, 177 | "fresh": { 178 | "version": "0.5.2", 179 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 180 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 181 | }, 182 | "function-bind": { 183 | "version": "1.1.1", 184 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 185 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 186 | }, 187 | "get-intrinsic": { 188 | "version": "1.1.1", 189 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 190 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 191 | "requires": { 192 | "function-bind": "^1.1.1", 193 | "has": "^1.0.3", 194 | "has-symbols": "^1.0.1" 195 | } 196 | }, 197 | "has": { 198 | "version": "1.0.3", 199 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 200 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 201 | "requires": { 202 | "function-bind": "^1.1.1" 203 | } 204 | }, 205 | "has-symbols": { 206 | "version": "1.0.3", 207 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 208 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 209 | }, 210 | "http-errors": { 211 | "version": "2.0.0", 212 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 213 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 214 | "requires": { 215 | "depd": "2.0.0", 216 | "inherits": "2.0.4", 217 | "setprototypeof": "1.2.0", 218 | "statuses": "2.0.1", 219 | "toidentifier": "1.0.1" 220 | } 221 | }, 222 | "iconv-lite": { 223 | "version": "0.4.24", 224 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 225 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 226 | "requires": { 227 | "safer-buffer": ">= 2.1.2 < 3" 228 | } 229 | }, 230 | "inherits": { 231 | "version": "2.0.4", 232 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 233 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 234 | }, 235 | "ipaddr.js": { 236 | "version": "1.9.1", 237 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 238 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 239 | }, 240 | "media-typer": { 241 | "version": "0.3.0", 242 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 243 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 244 | }, 245 | "merge-descriptors": { 246 | "version": "1.0.1", 247 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 248 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 249 | }, 250 | "methods": { 251 | "version": "1.1.2", 252 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 253 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 254 | }, 255 | "mime": { 256 | "version": "1.6.0", 257 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 258 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 259 | }, 260 | "mime-db": { 261 | "version": "1.52.0", 262 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 263 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 264 | }, 265 | "mime-types": { 266 | "version": "2.1.35", 267 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 268 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 269 | "requires": { 270 | "mime-db": "1.52.0" 271 | } 272 | }, 273 | "ms": { 274 | "version": "2.0.0", 275 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 276 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 277 | }, 278 | "negotiator": { 279 | "version": "0.6.3", 280 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 281 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 282 | }, 283 | "object-inspect": { 284 | "version": "1.12.2", 285 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 286 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" 287 | }, 288 | "on-finished": { 289 | "version": "2.4.1", 290 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 291 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 292 | "requires": { 293 | "ee-first": "1.1.1" 294 | } 295 | }, 296 | "packet-reader": { 297 | "version": "1.0.0", 298 | "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", 299 | "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" 300 | }, 301 | "parseurl": { 302 | "version": "1.3.3", 303 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 304 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 305 | }, 306 | "path-to-regexp": { 307 | "version": "0.1.7", 308 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 309 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 310 | }, 311 | "pg": { 312 | "version": "8.7.3", 313 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz", 314 | "integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==", 315 | "requires": { 316 | "buffer-writer": "2.0.0", 317 | "packet-reader": "1.0.0", 318 | "pg-connection-string": "^2.5.0", 319 | "pg-pool": "^3.5.1", 320 | "pg-protocol": "^1.5.0", 321 | "pg-types": "^2.1.0", 322 | "pgpass": "1.x" 323 | } 324 | }, 325 | "pg-connection-string": { 326 | "version": "2.5.0", 327 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", 328 | "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" 329 | }, 330 | "pg-int8": { 331 | "version": "1.0.1", 332 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 333 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" 334 | }, 335 | "pg-pool": { 336 | "version": "3.5.1", 337 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz", 338 | "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==" 339 | }, 340 | "pg-protocol": { 341 | "version": "1.5.0", 342 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", 343 | "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" 344 | }, 345 | "pg-types": { 346 | "version": "2.2.0", 347 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 348 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 349 | "requires": { 350 | "pg-int8": "1.0.1", 351 | "postgres-array": "~2.0.0", 352 | "postgres-bytea": "~1.0.0", 353 | "postgres-date": "~1.0.4", 354 | "postgres-interval": "^1.1.0" 355 | } 356 | }, 357 | "pgpass": { 358 | "version": "1.0.5", 359 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", 360 | "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", 361 | "requires": { 362 | "split2": "^4.1.0" 363 | } 364 | }, 365 | "postgres-array": { 366 | "version": "2.0.0", 367 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 368 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" 369 | }, 370 | "postgres-bytea": { 371 | "version": "1.0.0", 372 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 373 | "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" 374 | }, 375 | "postgres-date": { 376 | "version": "1.0.7", 377 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 378 | "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==" 379 | }, 380 | "postgres-interval": { 381 | "version": "1.2.0", 382 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 383 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 384 | "requires": { 385 | "xtend": "^4.0.0" 386 | } 387 | }, 388 | "proxy-addr": { 389 | "version": "2.0.7", 390 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 391 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 392 | "requires": { 393 | "forwarded": "0.2.0", 394 | "ipaddr.js": "1.9.1" 395 | } 396 | }, 397 | "qs": { 398 | "version": "6.10.3", 399 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 400 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", 401 | "requires": { 402 | "side-channel": "^1.0.4" 403 | } 404 | }, 405 | "range-parser": { 406 | "version": "1.2.1", 407 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 408 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 409 | }, 410 | "raw-body": { 411 | "version": "2.5.1", 412 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 413 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 414 | "requires": { 415 | "bytes": "3.1.2", 416 | "http-errors": "2.0.0", 417 | "iconv-lite": "0.4.24", 418 | "unpipe": "1.0.0" 419 | } 420 | }, 421 | "safe-buffer": { 422 | "version": "5.2.1", 423 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 424 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 425 | }, 426 | "safer-buffer": { 427 | "version": "2.1.2", 428 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 429 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 430 | }, 431 | "send": { 432 | "version": "0.18.0", 433 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 434 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 435 | "requires": { 436 | "debug": "2.6.9", 437 | "depd": "2.0.0", 438 | "destroy": "1.2.0", 439 | "encodeurl": "~1.0.2", 440 | "escape-html": "~1.0.3", 441 | "etag": "~1.8.1", 442 | "fresh": "0.5.2", 443 | "http-errors": "2.0.0", 444 | "mime": "1.6.0", 445 | "ms": "2.1.3", 446 | "on-finished": "2.4.1", 447 | "range-parser": "~1.2.1", 448 | "statuses": "2.0.1" 449 | }, 450 | "dependencies": { 451 | "ms": { 452 | "version": "2.1.3", 453 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 454 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 455 | } 456 | } 457 | }, 458 | "serve-static": { 459 | "version": "1.15.0", 460 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 461 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 462 | "requires": { 463 | "encodeurl": "~1.0.2", 464 | "escape-html": "~1.0.3", 465 | "parseurl": "~1.3.3", 466 | "send": "0.18.0" 467 | } 468 | }, 469 | "setprototypeof": { 470 | "version": "1.2.0", 471 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 472 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 473 | }, 474 | "side-channel": { 475 | "version": "1.0.4", 476 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 477 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 478 | "requires": { 479 | "call-bind": "^1.0.0", 480 | "get-intrinsic": "^1.0.2", 481 | "object-inspect": "^1.9.0" 482 | } 483 | }, 484 | "split2": { 485 | "version": "4.1.0", 486 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", 487 | "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" 488 | }, 489 | "statuses": { 490 | "version": "2.0.1", 491 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 492 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 493 | }, 494 | "toidentifier": { 495 | "version": "1.0.1", 496 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 497 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 498 | }, 499 | "type-is": { 500 | "version": "1.6.18", 501 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 502 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 503 | "requires": { 504 | "media-typer": "0.3.0", 505 | "mime-types": "~2.1.24" 506 | } 507 | }, 508 | "unpipe": { 509 | "version": "1.0.0", 510 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 511 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 512 | }, 513 | "utils-merge": { 514 | "version": "1.0.1", 515 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 516 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 517 | }, 518 | "vary": { 519 | "version": "1.1.2", 520 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 521 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 522 | }, 523 | "xtend": { 524 | "version": "4.0.2", 525 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 526 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 527 | } 528 | } 529 | } 530 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "postgres-node", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "express": "^4.18.1", 14 | "pg": "^8.7.3" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /queries.js: -------------------------------------------------------------------------------- 1 | const Pool = require('pg').Pool; 2 | const pool = new Pool({ 3 | user: 'me', 4 | host: 'localhost', 5 | database: 'api2', 6 | password: '12345', 7 | port: 5432, 8 | }); 9 | const getUsers = (request, response) => { 10 | pool.query('SELECT * FROM users ORDER BY id ASC', (error, results) => { 11 | if (error) { 12 | throw error; 13 | } 14 | response.status(200).json(results.rows); 15 | }); 16 | }; 17 | 18 | const getUserById = (request, response) => { 19 | const id = parseInt(request.params.id); 20 | 21 | pool.query('SELECT * FROM users WHERE id = $1', [id], (error, results) => { 22 | if (error) { 23 | throw error; 24 | } 25 | response.status(200).json(results.rows); 26 | }); 27 | }; 28 | 29 | const createUser = (request, response) => { 30 | const { name, email } = request.body; 31 | 32 | pool.query( 33 | 'INSERT INTO users (name, email) VALUES ($1, $2) RETURNING *', 34 | [name, email], 35 | (error, results) => { 36 | if (error) { 37 | throw error; 38 | } 39 | response.status(201).send(`User added with ID: ${results.rows[0].id}`); 40 | } 41 | ); 42 | }; 43 | 44 | const updateUser = (request, response) => { 45 | const id = parseInt(request.params.id); 46 | const { name, email } = request.body; 47 | 48 | pool.query( 49 | 'UPDATE users SET name = $1, email = $2 WHERE id = $3', 50 | [name, email, id], 51 | (error, results) => { 52 | if (error) { 53 | throw error; 54 | } 55 | response.status(200).send(`User modified with ID: ${id}`); 56 | } 57 | ); 58 | }; 59 | 60 | const deleteUser = (request, response) => { 61 | const id = parseInt(request.params.id); 62 | 63 | pool.query('DELETE FROM users WHERE id = $1', [id], (error, results) => { 64 | if (error) { 65 | throw error; 66 | } 67 | response.status(200).send(`User deleted with ID: ${id}`); 68 | }); 69 | }; 70 | 71 | module.exports = { 72 | getUsers, 73 | getUserById, 74 | createUser, 75 | updateUser, 76 | deleteUser, 77 | }; 78 | --------------------------------------------------------------------------------