node.js restful api 서버 만들기 (with bigQuery)
GET : 서버 자원 가져오기
POST : 서버 자원 등록하기
PUT : 서버 자원 치환 (업데이트 같은...)
PATCH : 서버 자원 일부 치환
DELETE : 서버 자원 삭제
ㅡ. Express 서버
$ sudo npm i express-generator -g
express PROJECT_NAME --view=pug
cd PROJECT_NAME 후 npm i 로 모듈 설치를 진행합니다.
모듈 설치가 완료되면
ㅡ. app.js
app.js 에서 app.use('/users', usersRouter) 부분이
localhost:3000/users 로 접속하면 usersRouter 의 페이지를 띄워주게 됩니다.
users.js 코드를 아래와 같이 구성한다면
var express = require('express'); var router = express.Router(); /* GET users listing. */ router.get('/', function(req, res, next) { res.send('respond with a resource'); }); module.exports = router;
결과화면으로 respond with a resource 가 나오게 됩니다.
post 를 처리해보는 코드를 작성해보겠습니다.
bigQuery 데이터를 fetch 해서 처리하는 로직을 구상했습니다.
$ npm install --save @google-cloud/bigquery
https://cloud.google.com/bigquery/docs/quickstarts/quickstart-client-libraries?hl=ko#client-libraries-install-nodejs에서 제공하고 있는 코드를 사용하였습니다. res 를 인자로 받아와서 query()가 실행될때 마지막에 res.send()를 수행하였습니다.
const query=async(res)=>{ // Queries the U.S. given names dataset for the state of Texas. const bigquery = new BigQuery(); const query = `SELECT name FROM \`bigquery-public-data.usa_names.usa_1910_2013\` WHERE state = 'TX' LIMIT 100`; // For all options, see https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query const options = { query: query, // Location must match that of the dataset(s) referenced in the query. location: 'US', }; // Run the query as a job const [job] = await bigquery.createQueryJob(options); console.log(`Job ${job.id} started.`); // Wait for the query to finish const [rows] = await job.getQueryResults(); // Print the results console.log('Rows:'); rows.forEach(row => console.log(row)); res.send(rows) }
/* POST users listing. */ router.post('/', async function(req, res, next) { await query(res) });
(*package.json을 확인하면 script 에 npm start 라고 되어있습니다. 시작은 npm start, default port 는 3000 입니다.)


post 로 요청한 key, value과 query params 로 넘겨주는 부분이었기 때문에
req.query.[key-name] 으로 접근할 수 있습니다.

ㅡ. port 변경
bin/www 에서 변경할 수 있습니다.
#!/usr/bin/env node /** * Module dependencies. */ var app = require('../app'); var debug = require('debug')('bigqueryapi:server'); var http = require('http'); /** * Get port from environment and store in Express. */ var port = normalizePort(process.env.PORT || '3000'); app.set('port', port); /** * Create HTTP server. */ var server = http.createServer(app); /** * Listen on provided port, on all network interfaces. */ server.listen(port); server.on('error', onError); server.on('listening', onListening); /** * Normalize a port into a number, string, or false. */ function normalizePort(val) { var port = parseInt(val, 10); if (isNaN(port)) { // named pipe return val; } if (port >= 0) { // port number return port; } return false; } /** * Event listener for HTTP server "error" event. */ function onError(error) { if (error.syscall !== 'listen') { throw error; } var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; // handle specific listen errors with friendly messages switch (error.code) { case 'EACCES': console.error(bind + ' requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': console.error(bind + ' is already in use'); process.exit(1); break; default: throw error; } } /** * Event listener for HTTP server "listening" event. */ function onListening() { var addr = server.address(); var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; debug('Listening on ' + bind); }
전체 Post 코드
var express = require('express'); var router = express.Router(); const {BigQuery} = require('@google-cloud/bigquery'); const query=async(res, category)=>{ // Queries the U.S. given names dataset for the state of Texas. const bigquery = new BigQuery(); const query = `SELECT name FROM \`bigquery-public-data.usa_names.usa_1910_2013\` WHERE state = 'TX' LIMIT 100`; // For all options, see https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query const options = { query: query, // Location must match that of the dataset(s) referenced in the query. location: 'US', }; // Run the query as a job const [job] = await bigquery.createQueryJob(options); console.log(`Job ${job.id} started.`); // Wait for the query to finish const [rows] = await job.getQueryResults(); // Print the results console.log('Rows:'); rows.forEach(row => console.log(row)); res.send(rows) } /* POST users listing. */ router.post('/', async function(req, res, next) { //res.json(users); await query(res, req.query.category) }); module.exports = router;
'JS' 카테고리의 다른 글
JS06 :: 바닐라 JS 프로젝트(2) (0) | 2021.05.22 |
---|---|
JS06 :: 바닐라 JS 프로젝트 (0) | 2021.05.21 |
JS04 :: webpack (0) | 2020.08.25 |
JS03 :: node.js 버전 관리 (0) | 2020.08.25 |
JS02 :: hash map (0) | 2020.07.29 |
댓글
이 글 공유하기
다른 글
-
JS06 :: 바닐라 JS 프로젝트(2)
JS06 :: 바닐라 JS 프로젝트(2)
2021.05.22 -
JS06 :: 바닐라 JS 프로젝트
JS06 :: 바닐라 JS 프로젝트
2021.05.21 -
JS04 :: webpack
JS04 :: webpack
2020.08.25 -
JS03 :: node.js 버전 관리
JS03 :: node.js 버전 관리
2020.08.25
댓글을 사용할 수 없습니다.