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 입니다.)

key : category, value : web 으로 post 요청을 보냈습니다.
result 값을 받아올 수 있었고

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