簡體   English   中英

將數據從路由器傳遞到服務器文件 node.js express

[英]Passing data from router to server file 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 請求的處理數據傳遞給服務器,我該怎么做?

如果您只想將在路由處理程序中處理的數據發送到客戶端,則無需先將其發送到server文件,您可以從路由處理程序發出。 為此,您必須存儲對套接字對象的引用,以便您可以在除套接字連接回調函數之外的其他地方使用它。

更新server.jsonConnect函數,以在 app locals 中存儲對套接字的引用:

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);
});

可能你忘了從 route.js 導出路由。 使用module.export = route; 在 route.js 文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM