Вам не нужно создавать какую-либо структуру моделей для такой простой задачи, используя lowdb
.
Ваши searchJobs
устанавливают jobs
неправильно внутри db.json
И это потому, что в конце удаления вы push
весь массив jobs
в поле с именем job
, которое принадлежит jobs
. Это, очевидно, приведет к получению таких данных:
{
"jobs": [
{
"job": [
{
"title": "...",
"linkToJob": "...",
"body": "..."
},
{
"title": "...",
"linkToJob": "...",
"body": "..."
},
...
}
],
"body": []
}
, что не то, что вам нужно. Таким образом, вместо использования:
db.get('jobs').push({
job: jobs
}).write();
вы должны использовать:
db.set('jobs', jobs).write();
, и тогда у вас будет формат данных JSON, подобный следующему:
{
"jobs": [
{
"title": "...",
"linkToJob": "...",
"body": "..."
},
{
"title": "...",
"linkToJob": "...",
"body": "..."
},
...
],
"body": []
}
и теперь у вас есть правильная коллекция jobs
, которую вы можете использовать для отображения данных.
Express сервер имеет механизм шаблонов ( "Использование шаблонизаторов с Express" ), который поддерживает ( среди прочих ) E JS шаблонов. Вы можете использовать шаблон E JS и получать / передавать задания в нем по маршруту root:
Код для express файл сервера server.js
const low = require("lowdb");
const FileSync = require("lowdb/adapters/FileSync");
const express = require('express');
const app = express();
const port = 3000;
const adapter = new FileSync('db.json');
const db = low(adapter);
// Set express views template engine to EJS
app.set('view engine', 'ejs');
app.get('/', (req, res) => {
// Get the jobs collection
const jobs = db.get('jobs').value();
// Render the jobs EJS template by passing the jobs
res.render("jobs", { jobs });
});
app.listen(port, () => console.log(`Listening on port ${port}!`))
E JS шаблон для рендеринга заданий jobs.ejs
:
...
<body>
<section id="jobs">
<% for(const job of jobs) {%>
<div class="job">
<a href="<%= job.linkToJob %>"><h3><%= job.title %></h3></a>
<p><%= job.body %></p>
</div>
<% } %>
</section>
</body>
...
И окончательный webScraper.js
:
const axios = require("axios");
const cheerio = require("cheerio");
const db = require("./db");
async function searchJobs() {
const url = await axios
.get("https://indeed.com/jobs?q=Web+Developer&l=Atlanta&fromage=last")
.then(response => response)
.then(res => {
const jobs = [];
const $ = cheerio.load(res.data);
$(".result").each((index, element) => {
const title = $(element)
.children(".title")
.text();
const linkToJob = $(element)
.children(".title")
.children("a")
.attr("href");
const body = $(element)
.children(".summary")
.text();
jobs.push({ title, linkToJob, body });
});
// Push jobs to JSON DB
db.set('jobs', jobs).write();
});
}
Теперь, если вы запустите сервер express и посетите root маршрут, вы увидите что-то вроде этого ( после запуска webScraper.js
конечно ):
.job {
margin-bottom: 10px;
border: 1px grey solid;
padding: 10px;
border-radius: 5px;
background-color: lightgray;
}
<section id="jobs">
<div class="job">
<a href="/rc/clk?jk=45633fe1e5f39cc8&fccid=0e1982cac02545cc&vjs=3">
<h3>Freelance Web Developer</h3>
</a>
<p>Extensive knowledge of HTML, CSS, Javascript/jQuery.</p>
</div>
<div class="job">
<a href="/rc/clk?jk=b554d8be38d65cba&fccid=8c101aef95dbfdf6&vjs=3">
<h3>Web Developer</h3>
</a>
<p>VenU is looking for a talented and reliable developer to join an elite development team.
Applicants must be proficient in Responsive Design, with experience…</p>
</div>
<div class="job">
<a href="/rc/clk?jk=8edc3f88b6ec3083&fccid=9899b2a8ca7c5e21&vjs=3">
<h3>Web Developer</h3>
</a>
<p>We're looking for a web developer with an excellent eye for design as well as strong HTML & CSS skills.
The web developer will be responsible for creating new…
</p>
</div>
</section>