javascript - 将数据从路由器传递到服务器文件 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
先将其发送到文件,您可以从路由处理程序发出。为此,您必须存储对套接字对象的引用,以便可以在套接字连接回调函数之外的其他地方使用它。
更新您的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);
});
推荐阅读
- javascript - 如何使用 webview 在 reactNative 中显示 Pdf 文档?
- database - 在 PostgreSQL 中,时区偏移采用了错误的符号
- ios - UIView.animateWithDuration:animations:completion: 在 XCTest 中被取消
- postgresql - pgpool-II 不会缓存一些查询,即使它应该
- docker - 重启后rancher持久数据丢失
- android-sqlite - FROM 子句中的 Android Room 子查询未按预期工作
- shell - DB2+MQ,无法创建 db2mq.tmp:权限被拒绝...但是 /tmp 有我的用户
- javascript - 如何获取 React 组件内的文本长度
- typescript - 如何让打字稿意识到`find`可能返回未定义?
- javascript - 如何使用 Javascript 将数据从所有 WebGrid 行传递到 MVC 控制器?