有没有一种方法可以在服务器端访问DOM?

3

我正在尝试摆脱教程地狱,创造一个可以让我的生活更轻松的东西 (讽刺),这是一个小时计算器。

我不会过多介绍功能,但基本上它只是一个应用程序,存储我所有月份的工作小时数,我可以通过点击一个按钮在月末计算它们。

然而,我卡住了,我对此非常新手(特别是后端),我找不到一种访问DOM的方法,根据我的理解,这是正常的,因为它是服务器端代码。

然而,我只需要知道如何抓取DOM元素并将其分配给变量,如果这个功能在后端不存在,是否有替代方法...

document.querySelector('...')

我已经安装了JSDOM,但据我所知,您只能传递代码段而无法访问整个页面? 我可能完全错了...

有人可以帮助我更清楚地理解/做什么吗?

这是我的app.js代码,请轻松 :)

const express = require('express'),
    app = express(),
    bodyParser = require('body-parser'),
    mongoose = require('mongoose'),
    jsdom = require("jsdom"),
    { JSDOM } = jsdom,
    dom = new JSDOM('localhost:3000/');

// ----------------------------------------//
const date = new Date(),
    day = date.getDate(),
    month = date.toLocaleString('default', { month: 'long' }),
    table = dom.window.document.querySelector('table'),
    totalShiftHours = dom.window.document.querySelectorAll('.totalShiftHours');



app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static('public'));
app.set('view engine', 'ejs');
app.listen(3000, () => console.log("I'm listening"));
mongoose.connect('mongodb://localhost:27017/hours_calculator', { useNewUrlParser: true, useUnifiedTopology: true });

const shiftSchema = new mongoose.Schema({
    date: Number,
    startTime: Number,
    finishTime: Number,
    lunchTime: Number,
});
const Shift = mongoose.model('Shift', shiftSchema);

app.get('/', (req, res) => {
    Shift.find({}, (err, allShifts) => {
        if (err) console.log(`There's an error: ${err}`)
        else res.render('index', {
            shifts: allShifts,
            day: day,
            month: month,
            table: table,
            totalShiftHours: totalShiftHours
        })
    })
});

app.post('/', (req, res) => {
    const startTime = Number(req.body.startTime),
        finishTime = Number(req.body.endTime),
        lunchTime = Number(req.body.lunchTime),
        newShift = {
            date: day,
            startTime: startTime,
            finishTime: finishTime,
            lunchTime: lunchTime
        };
    Shift.create(newShift, (err, newShift) => {
        if (err) console.log(`Somethings wrong, ${err}`);
        else res.redirect('/')
    })
});

2
DOM存在于客户端浏览器中。可能会有数十个、数百个、数千个客户端。直接从服务器访问这些客户端是没有意义的。 - Pointy
1个回答

2
除了 DOM 的某些虚拟化以外,服务器端没有 DOM。在您的情况下,如果您想编写这样的应用程序,最好分别创建前端和后端代码。前端部分可以由您的服务器提供(甚至可以使用 express 中的 app.static 方法实现),它将包括 HTML、CSS、JavaScript 代码,在其中您将能够操作表单值,然后可以使用 ajax/fetch API 或传统的表单 POST 请求向服务器发送请求。稍后,服务器将处理这些值,并将数据保存到数据库中(就像您正在使用 mongoose 一样)。我希望我描述得足够清楚,并且能够帮助您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接