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