[Node JS] 자동완성 구현
HTTP GET request
Node JS express
, ajax
, sqlite3
그리고 python script
를 이용해 검색박스에 자동완성 기능을 구현했다.
Node JS express
, ajax
, sqlite3
그리고 python script
를 이용해 검색박스에 자동완성 기능을 구현했다.
Summary
- 클라이언트에서 서버로 GET요청
• 클라이언트 측에서 검색박스에 키보드 타이핑을 할때마다 텍스트값이ajax
통신을 이용해 서버로GET
요청을 타고 들어간다.- 서버에서 파이썬 함수 호출
• 서버의 해당 미들웨어에선 미리 만들어둔 파이썬 스크립트가 인자로 전달받은 텍스트값과sqlite
로 만들어둔DB
와 비교해 일치하는지 확인 후 일치하는 값 모두를 리턴해준다.- 서버에서 GET요청에 대한 응답
• 파이썬 리턴이 완료되면 미들웨어에서 마지막으로 전달받은 리턴값을 클라이언트 측으로 응답한다.
What is
HTTP
http
는 웹서버와 웹브라우저간의 통신을 하기 위한 표준 방식이다. 한 컴퓨터에서 다른 컴퓨터로 데이터를 요청하고 응답해주기 위한 규칙이라고 생각하면 된다. 텍스트, 이미지 및 기타 멀티미디어 파일과 같은 데이터들이 웹에서 공유될 수 있다.HTTP GET request
• 읽을때
• 길이제한 있음
• 민감한 정보 포함 X
• 브라우저 히스토리에 매개변수가 남을수 있음
•URL
에 데이터가 노출 OHTTP POST request
• 작성할때
• 길이제한 없음
• 브라우저 히스토리에 매개변수가 남을수 없음
•URL
에 데이터가 노출 X
• 데이터는http request
의request body
에 저장HTTP PUT request
•수정할때
HTTP DELETE request
•삭제할때
Response
Response
는 서버에서 만들어지며 클라이언트로 보내진다. 클라이언트에서Request
를 보냈을때Response
로 답장할 수 있다.
References:
- https://www.w3schools.com/tags/ref_httpmethods.asp
- https://www.ibm.com/docs/en/cics-ts/5.2?topic=protocol-http-responses
- https://www.geeksforgeeks.org/http-full-form/
1. 클라이언트에서 서버로 GET요청
아래는
GIF
이미지에 나오는html
파일 코드의 일부분이다.
html
의oninput
이벤트를 사용해 키보드 입력이 있을때마다 자바스크립트의sendAjax()
함수를 호출하도록 해놨다.
<!-- keystroke.html -->
<label for="Country">Country</label>
<input name="Country" type="text" id="Country" placeholder="Enter Country" oninput='sendAjax()' /> <br>
answer: <span id="answer"></span> <br><br>
sendAjax()
함수가 호출되면 검색박스의 텍스트값을document.getElementById('Country').value
변수를 이용해country
변수에 넣어준다.2-1. 만약
country
변수 값이 없다면ajax
함수를 호출하지 않고answer.innerHTML
에 빈값을 넣어준 후sendAjax()
함수를 끝낸다.
2-2. 만약country
변수 값이 있다면ajax
함수를 호출하고ajax
함수를 호출한다.
미들웨어 요청타입과ajax
함수의type: "get"
부분, 그리고url: 'http://localhost:8080/keystroke/:country'
부분과Node JS
미들웨어 경로 부분이 일치해야 통신이 가능하니 잘 확인해 주어야 한다.data:{country:country}
에서 왼쪽country
는 서버측에서 사용되어질 변수 이름이고 오른쪽country
는 지금 자바스크립트에서 사용하는 변수다.
//javascript
<script>
function sendAjax() {
var country = document.getElementById("Country").value;
if (country==='') { // if country variable has nothing, change answer.innerHTML variable to empty varaible.
answer.innerHTML = '';
return ;
}
$.ajax({
type: "get",
url: 'http://localhost:8080/keystroke/:country',
// left side 'country' var is used in the server side later,
// right side 'country' var is being used here in javascript.
data: {country:country},
dataType:'json',
success: function(res) {
answer.innerHTML = res.country;
}
});
}
</script>
2. 서버에서 파이썬함수 호출
▼index.js▼
지금까지
html
파일을 이용해 클라이언트 측에서 작업해 둔 내용을 서버에서 돌리려면res.sendFile()
메소드를 사용하면 된다. 이렇게 하면 해당url
에 대한GET
요청이 들어왔을때 방금까지 만들어 줬던keystroke.html
파일로 응답할 수 있다.
app.get('/keystroke', function(req, res) {
res.sendFile(__dirname + '/keystroke.html');
});
검색상자에서
sendAjax()
함수를 이용한/keystroke/:country
경로로 get요청이 들어왔을때 해당 경로를 가진GET
타입의 미들웨어가 실행된다. 해당 미들웨어는 파이썬 스크립트를 실행할 수 있는 내용을 포함하고 있다. 추가로 파이썬 스크립트를 실행하기 위해서python-shell
설치와import
해주도록 하자.
npm install python-shell
// importing python-shell
var PythonShell = require('python-shell');
app.get('/keystroke/:country', function(req, res) {
var options = {
mode: 'json',
pythonPath:'',
pythonOptions:['-u'],
scriptPath:'',
args: [req.query.country]
};
PythonShell.PythonShell.run('./pythonScript/prePopulate.py', options, function(err, results) {
if(err) throw err;
res.status(200).send(results[0]);
});
});
▼prePopulate.py▼
파이썬 함수에서 인자로 받은 변수에 접근은sys.argv
를 통해 가능하다.
sys.argv[0]
은 변수의 갯수를 담고있고sys.argv[1:]
가 넘겨받은 변수이다.
import sqlite3
import sys
import json
def main(arg):
#sql processing
conn = sqlite3.connect("test.db")
cursor = conn.cursor()
cursor.execute("SELECT name FROM COUNTRY")
data = cursor.fetchall()
results = {}
results["country"] = []
last_answer = ''
#comparing with the db file
for row in data:
for word in row:
if word != last_answer and arg == word[:len(arg)].strip().lower():
results["country"].append(word)
last_answer = word
return_value = json.dumps(results)
print(return_value)
if __name__ == '__main__':
main(sys.argv[1])
3. 서버에서 GET요청에 대한 응답
파이썬 스크립트가 끝나면 리턴값은
results
변수에 담겨져 나온다.
res.status(200).send()
메소드를 이용해 클라이언트측으로 응답할 수 있다.
PythonShell.PythonShell.run('./pythonScript/prePopulate.py', options, function(err, results) {
if(err) throw err;
res.status(200).send(results[0]);
});
sendAjax()
함수의ajax
함수에서 응답을 받아서answer.innerHTML
변수를 이용해 결과값을 클라이언트측에 나타낼 수 있다.
$.ajax({
type: "get",
url: 'http://localhost:8080/keystroke/:country',
data: {country:country},
dataType:'json',
success: function(res) {
answer.innerHTML = res.country;
}
});
마지막으로 폴더의 상태는 아래와 같다.
Author And Source
이 문제에 관하여([Node JS] 자동완성 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kon6443/Node-JS-자동완성-구현저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)