I'm new to Node JS. Below is my code. On AJAX call new data is not being rendered. Is this the right way to render data without loading the entire page? Is there any better way to load only data without using AJAX.
App.js file:
app.get('/users', function(req, res) {
var query = req.query.search;
User.find({'name' : new RegExp(query, 'i')}, function(err, users){
var data = {list:users};
console.log("Searching for "+data);
res.render('admin/users',{data:data});
});
});
Ajax call in ejs file:
<script>
function showResult(str) {
var xmlHttp = null;
xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", "/admin/users?search="+str, true );
xmlHttp.send( null );
return xmlHttp.responseText;
}
</script>
<input type="text" id="search" name="search" placeholder="Search" class="form-control col-md-7 col-xs-12" onkeyup="showResult(this.value)" >
Super simple demo
routes.js
app.get('/search', searchController.index);
app.get('/search_partial', searchController.partial);
searchController.js
const data = [{ text: 'apple' }, { text: 'potato' }, { text: 'sugar' }];
exports.index = (req, res) => {
res.render('search/index');
};
exports.partial = (req, res) => {
const query = req.query.search;
// emulate mongoose query
const result = data.filter(item => new RegExp(query, 'i').test(item.text));
res.render('search/partial', { result });
};
search/index.pug
extends ../layout
block content
.page-header
h3 Search
form.form-horizontal(onsubmit="searchPartial(this);return false;")
.form-group
label(class='col-sm-2 control-label', for='search') Text
.col-sm-8
input.form-control(type='text', name='search', id='search', autofocus=true)
.form-group
.col-sm-offset-2.col-sm-8
button.btn.btn-primary(type='submit')
i.fa.fa-search
| Find
#search-result
search/partial.pug
.row
each item in result
.col-sm-3
h2=item.text
client-side.js
/* eslint-disable */
$(document).ready(function() {
// Place JavaScript code here...
function searchPartial(form) {
var formData = $(form).serializeArray();
$.get('/search_partial', {
search: formData[0].value
}).then(function (data) {
$('#search-result').html(data);
});
}
window.searchPartial = searchPartial;
});
This sample should help you, as you can see, we need 2 routes
Also recommend you to look at hackaton-starter-kit