Написание функции в nodejs и отображение ее в виде - PullRequest
1 голос
/ 11 марта 2020

Итак, я очищаю веб-сайт и хочу, чтобы он показывал данные внутри HTML, и у меня возникают проблемы с его работой. Я пытаюсь использовать

document.getElementById('results').innerHTML = searchJobs('');

Но это говорит мне, что документ не определен, извините, вопрос-нюби, но его проще задать, чем застревать на одном предмете в течение 45 минут.

Вот код:

function searchJobs(i) {
    const url = axios.get('actualurl')
    return fetch(`${url}${i}`)
        .then(response => response.text())
        .then(res => {
            const jobs = [];
            const jobsBody = [];
            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[index] = { title, linkToJob, body };
            });

            return jobs;

        });
}
document.getElementById('results').innerHTML = searchJobs('');
module.exports = searchJobs;

Я могу получить скребок в console.log просто отлично.

index route:

const express = require('express');
const router = express.Router();
const scrapper = require('../scrappers/scrappers');

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

app. js:

const express = require('express'),
    path = require('path'),
    cookieParser = require('cookie-parser'),
    logger = require('morgan'),
    puppeteer = require('puppeteer'),
    axios = require('axios'),
    cheerio = require('cheerio');
es6Renderer = require('express-es6-template-engine');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

// view engine setup
app.engine('html', es6Renderer);
app.set('views', './views');
app.set('view engine', 'html');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

Я думаю, что проблема на самом деле в том, что именно короткая запись:

<body>
        <p id="results"></p>
        <script src="/scrappers/scrappers.js" async defer></script>
    </body>

1 Ответ

1 голос
/ 11 марта 2020

Мне кажется, я понимаю, чего вы пытаетесь достичь sh. Удалите строку document.getElementById из скребков. js и измените остальные так:

индексный маршрут:

router.get('/', function(req, res, next) {
  res.render('index', { locals: { results: scrapper.searchJobs() }});
});

просмотр:

<body>
  <p id="results">${results}</p>
</body>

Делая это то, что вы запускаете утилиту очистки на сервере внутри узла, а затем используете шаблонизатор для отображения результатов в HTML перед отправкой его в браузер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...