sdk.js?appkey=AppKey&libraries=services:4 A parser-blocking,
cross site (i.e. different eTLD+1) script,
http://t1.daumcdn.net/mapjsapi/js/main/4.4.1/kakao.js, is invoked via document.write.
The network request for this script MAY be blocked by the browser in this or
a future page load due to poor network connectivity.
If blocked in this page load, it will be confirmed in a subsequent console message.
See https://www.chromestatus.com/feature/5718547946799104 for more details.
var fs = require('fs');
var express = require('express')
var app = express()
//인덱스 페이지
app.get('/', function(request, response) {
fs.readFile('index.html', function (error, data) {
response.writeHead(200, { 'Content-Type': 'text/html' });
response.end(data);
console.log('메인페이지');
});
});
//===== 데이터베이스 연결 =====//
var MongoClient = require('mongodb').MongoClient;
//데이터베이스 객체를 위한 변수 선언
var database;
//데이터베이스에 연결
function connectDB() {
var databaseUrl = 'mongodb://localhost:27017/DB';
MongoClient.connect(databaseUrl, function(err, db) {
if (err) throw err;
console.log('데이터베이스에 연결되었습니다. : ' + databaseUrl);
// database 변수에 할당
database = db;
//database.collection is not a function 오류나서 추가해봄
database = db.db('DB');
});
}
app.listen(80, function() {
console.log('Example app listening on port 80!')
connectDB();
});
처음 디비 연동할 때, connectDB함수에서 database.collection is not a function이라는 오류를 맞닥뜨려서
추가한 내용 : database = db.db('DB');
몽고디비 버전마다 디비 연결 시 방법 차이가 있는것같은데 일단 나는 저방식으로 해결이 됐다
같은 이름의 컬렉션을 반복해서 추가할 경우, 에러가 발생하니 한번 생성한 컬렉션 이름은 잘 숙지하고
컬렉션을 추가할경우, 겹치지 않게 지정하자
Node.js MongoDB 컬렉션에 데이터 추가 (1개 일 때)
//DB에 등록
app.post('/register',function(request, response){
var body = request.body;
console.log('saveDB 호출');
saveDB(body.gansik);
response.end();
});
//데이터베이스 등록
function saveDB(body){
var databaseUrl = 'mongodb://localhost:27017/DB';
MongoClient.connect(databaseUrl, function(err, db) {
if (err) throw err;
database = db.db("gansik");
database.collection("gansik").insertOne(body, function(err, res) {
if (err) throw err;
console.log("등록이 완료되었습니다.");
db.close();
});
});
}
아직 1개씩만 저장하는 단계라 insertOne을 사용함
2개 이상의 데이터를 한번에 저장할 경우, insertMany 메서드를 사용한다
2개이상 저장 예시는 아래 사이트 참고
Node.js MongoDB 컬렉션에 저장된 DB 조회하기
//DB에서 가져오기
app.post('/find',function(request, response){
var body = request.body;
console.log('findDB 호출');
findDB();
});
function findDB(){
var url = "mongodb://localhost:27017/DB";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
database = db.db("gansik");
//모든 db 조회 가능
database.collection("gansik").find({}).toArray(function(err, result) {
if (err) throw err;
console.log('DB에서 가져온 결과 : ');
console.log(result);
db.close();
});
});
}
콜백으로 받은 result를 출력해보면 여태까지 DB에 저장된 모든값들이 find().pretty() 양식으로 출력된다
Node.js 특정 키의 값만 출력하고 싶은 경우
MongoClient.connect(url, function(err, db) {
if (err) throw err;
database = db.db("gansik");
//특정 db 조회 가능 - 이 예시는 _id랑 price값 출력 - find.pretty 양식으로 출력안되고 그냥 출력됨
database.collection("gansik").find({}, { projection: { price:1} }).toArray(function(err, result) {
if (err) throw err;
console.log('DB에서 가져온 결과 : lat long menu');
// console.log(' : '+result.lat_ +', '+result.long_+', '+result.menu);
console.log(result);
response.send(JSON.stringify(result));
db.close();
});
});
price 키에 해당하는 값과 디폴트로 정해진 _id의 값만이 출력됨
만약 price에 0 값을 주거나 아예 입력을 하지 않는다면 price의 값은 출력이 되지않는다
따라서 특정 필드를 unique로 정해준 상태가 아니어서
_id가 디폴트로 정해진 경우, {projection:{ _id: 0} } 을 입력한다면 _id 값은 출력되지 않음
특정 필드에 해당하는 값만 출력하고 싶을 때 사용하면 유용하겠다
Node.js 특정 키의 값만 출력하는 법 적용 예제
MongoClient.connect(url, function(err, db) {
if (err) throw err;
database = db.db("gansik");
//0이면 그 필드값은 안보이고 필드 값이 1일경우의 값만 보임
// _id 제외, name, menu, loc, price 출력 가능 - find.pretty 양식으로 출력됨
database.collection("gansik").find({}, { projection: { _id:0, name:1, menu:1, loc:1, price:1} }).toArray(function(err, result) {
if (err) throw err;
console.log(result);
response.send(JSON.stringify(result));
db.close();
});
});
_id는 출력되지 않으며 저장된 디비에서 모든 name, menu, loc, price의 값들만 출력이 가능하다
Node.js MongoDB 특정 값을 가진 데이터 조회하기
MongoClient.connect(url, function(err, db) {
if (err) throw err;
database = db.db("gansik");
var findDB_ = menu;
//쿼리 = 필터 사용해서 특정 값 조회 price가 2000원인 값의 모든 필드 조회 가능
var query = { menu: findDB_ };
database.collection("gansik").find(query).toArray(function(err, result) {
if (err) throw err;
console.log(result);
response.send(JSON.stringify(result));
db.close();
});
});
query에는 위에 적힌것처럼 저장된 DB에서
menu라는 키(key) 중에서 findDB_의 값을 가진 메뉴를 찾도록 한다
문자열을 검색해도 되고 나의 경우는 클라이언트가 요청한 정보를 검색하는걸 해보고싶어서
파라미터로 전달받은 변수 findDB_를 사용했다
Node.js DB에 있는 컬렉션 제거하기
var databaseUrl = 'mongodb://localhost:27017/gansikDB';
console.log('drop the db');
MongoClient.connect(databaseUrl, function(err, db) {
if (err) throw err;
database = db.db("gansik");
database.collection("gansik").drop(function(err, delOK) {
if (err) throw err;
if (delOK) console.log("Collection deleted");
db.close();
});
});
// Parse URL-encoded bodies (as sent by HTML forms)
app.use(express.urlencoded());
// Parse JSON bodies (as sent by API clients)
app.use(express.json());
// Access the parse results as request.body
app.post('/', function(request, response){
console.log(request.body.user.name);
console.log(request.body.user.email);
});
자바스크립트 JSON 데이터 POST로 서버에 전달해본 사용예시
function register(){
var menu = document.getElementById("menu").value;
var price = document.getElementById("price").value;
var pay = document.getElementById("pay").value;
var obj={"menu":menu,"price":price,"pay":pay};
//POST 데이터를 보낼 url - ex) localhost/register
fetch('/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
data:obj
})
});
}
이렇게하면 json 구조는 { data : {"menu": menu, "price": price, "pay": pay} }가 된다
app.post('/registerAddr',function(request, response){
var body = request.body;
console.log('body : ' + body.data.menu);
//input으로 받은 menu 값 출력 확인
});