首页 > 解决方案 > 将数据从路由器传递到服务器文件 node.js express

问题描述

我正在尝试使用 node.js 构建一个 Web 应用程序,并且我想将数据从我的路由器(处理表单的文件)传递到我的服务器文件,该文件实际上将向连接的其他用户发出事件。

路由器.js

module.exports=function(app) {
    const express = require('express');
    const User = require("./public/classes/User");
    const router = express.Router();
    const {check, validationResult} = require('express-validator');
    const {matchedData} = require('express-validator/filter');

    var userlist = new Array();


    router.get('/', (req, res) => {
        res.render('index', {
            data: {},
            errors: {}
        })
    });

    router.post('/enter', [
        check('username')
            .isLength({min: 1})
            .withMessage('Username is required').trim()   //implement personalized check
    ], (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
            return res.render('index', {
                data: req.body,
                errors: errors.mapped()
            })
        }
        const data = matchedData(req)

    });
    return router;


    //MOVE TO SUPPORT
    function find(name) {
        return 1;
    }

}

服务器.js

const express = require('express');
const layout = require('express-layout');
const app = express();
var server = require('http').createServer(app);
var io=require('socket.io')(server);
const routes = require('./router')(app);
const bodyParser = require('body-parser');
var fs = require("fs");



app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

const middleware = [
    layout(),
    express.static(path.join(__dirname, 'public')),
    bodyParser.urlencoded(),

];

app.use(middleware);

app.use('/', routes);

app.use((req, res, next) => {
    res.status(404).send("Sorry can't find that!");
});

app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send('Something broke!');
});



io.on('connect', onConnect);

function onConnect(socket) {
    var contents = fs.readFileSync("./public/rooms.json");
    let rooms = JSON.parse(contents);
    socket.emit('parse',rooms);
    socket.on('join',function (name, room) {
        console.log(name+" "+ room);
        socket.join(room);
        socket.user=name;
        socket.room=room;
    })
}



server.listen(3000, () => {
    console.log(`App running at http://localhost:3000`);
});

我想将我的 post 请求的处理数据传递给服务器,我该怎么做?

标签: javascriptnode.jsexpress

解决方案


如果您只想将路由处理程序中处理的数据发送到客户端,则无需server先将其发送到文件,您可以从路由处理程序发出。为此,您必须存储对套接字对象的引用,以便可以在套接字连接回调函数之外的其他地方使用它。

更新您的onConnect函数server.js以在应用程序本地存储对套接字的引用:

function onConnect(socket) {
  // Store the socket object in app locals
  app.locals.socket = socket;
  var contents = fs.readFileSync("./public/rooms.json");
  let rooms = JSON.parse(contents);
  socket.emit('parse',rooms);
  socket.on('join',function (name, room) {
      console.log(name+" "+ room);
      socket.join(room);
      socket.user=name;
      socket.room=room;
  })
}

在路由处理程序中,您可以随时发出数据:

router.post('/enter', [
  check('username')
    .isLength({ min: 1 })
    .withMessage('Username is required').trim()   //implement personalized check
], (req, res) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.render('index', {
      data: req.body,
      errors: errors.mapped()
    })
  }
  const data = matchedData(req)
  // Emit your data here:
  app.locals.socket.emit("data", data);
});

推荐阅读