【问题标题】:Writing a function in nodejs, and having it display in the view在nodejs中编写一个函数,并让它显示在视图中
【发布时间】:2020-03-11 16:42:38
【问题描述】:

所以我正在抓取一个网站,我希望它向 innerHTML 显示数据,但我无法让它工作。我正在尝试使用

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

但它告诉我文档没有定义,抱歉,nooby 问题,但问比在同一件事上停留 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就好了。

索引路线:

const express = require('express');
const router = express.Router();
const scraper = require('../scrapers/scrapers');

/* 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="/scrapers/scrapers.js" async defer></script>
    </body>

【问题讨论】:

  • node.js 中没有document 对象。那只会存在于浏览器或类似浏览器的环境中(例如,仅在该 Cheerio 上下文中存在的 Cheerio 创建)。此外,searchJobs() 返回一个您似乎没有正确使用的承诺。你能告诉我们你在哪里尝试使用searchJobs() 函数并准确描述你想用它完成什么吗?您是否尝试将作业数据插入到您的 Web 服务器正在呈现的页面中?如果有,是哪条路线?
  • 当你说你可以让刮板到console.log就好了你的意思是登录服务器还是浏览器?
  • @ajaybee 我让它登录控制台大声笑.. 就像我可以返回工作,然后 console.log(searchJobs())
  • 哪个控制台?节点应用程序可以 console.log 到服务器控制台。浏览器 JavaScript 会 console.log 到浏览器开发者控制台
  • @ajaybee 我的服务器终端我假设不在 chrome 中。

标签: javascript html node.js express


【解决方案1】:

我想我理解您想要完成的工作。从 scrapers.js 中删除 document.getElementById 行并像这样修改其他行:

索引路线:

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

查看:

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

通过这样做,您将在节点内部的服务器上运行抓取工具,然后使用模板引擎将结果呈现到 HTML 中,然后再将其发送到浏览器。

【讨论】:

  • 感谢您的帮助,现在我收到一个新错误,不确定是否在正确的轨道上,它告诉我“无法在视图目录中查找视图”错误“./views "
  • 它在你的views目录中寻找error.html文件
  • 抱歉,这很明显,每当使用类似 express 和 node 时,我的错误都非常令人困惑注意错误..有时。
  • 现在。它告诉我 searchJobs 不是一个函数.. 即使我需要其中包含该函数的“../scrappers/scrappers”。
  • 您正在将 searchJobs 导出为抓取工具,因此只需致电 scrapper()
猜你喜欢
  • 2020-01-17
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多