node.js - 如何使用 vuex 和 socketio 制作实时 crud?
问题描述
我想使用 vuex、node、express 和 socketio 执行实时 crud,但使用以下语法我无法得到结果。
服务器
index.js
const server = app.listen('3000',() => {
console.log('<--- Web Server Starter --->')
const io = require('./sockets')(server)
io.on('connection', socket=>{
console.log('client connected');
})
})
socket.js
let io
module.exports = {
init:httpServer =>{
io = require('socket.io')(httpServer)
return io
},
getIo:()=>{
if(!io){
throw new Error('socket io not initialized')
}
return io
}
}
用户.js
const io = require('../socket')
router.post('/newuser',(req, res) => {
res.json({ serverResponse: 'userCreated' })
io.getIo().emit('newuser',{serverResponse:'created',user:user})
})
客户
模块 user.js(VUEX 动作)
getusers({ commit }){
const sessionToken = localStorage.getItem('sessionToken')
axios.get('/newuser', {
headers: {
Authorization: `Bearer ${localStorage.getItem('sessionToken')}`
},
})
.then(response => {
const socket = openSocket('http://localhost:3000')
socket.on('newuser', data => {
if (data.serverResponse === 'created') {
this.users = data.user
commit('GET_USERS', users)
})
})
.catch(error => {
alert(error)
})
})
当我创建新用户时,用户列表并没有自动更新,但是我必须刷新页面才能看到新用户,为什么会出现这种情况?
解决方案
这是因为在您的后端,您正在处理 post url-endpoint'/newuser'
以获取数据。您实际上并没有使用 socketio 发布数据,因此如果您不更新页面,axios.get
那么在您发布的 API 刷新之前,您的函数将不会获得任何新数据。最好将您的套接字客户端代码放在 axios 承诺之外,以便数据主要由 socketio 在客户端上更新,而不是由 API 更新。
编辑: 这是您客户端中的代码
getusers({
commit
}) {
const sessionToken = localStorage.getItem('sessionToken')
axios.get('/newuser', {
headers: {
Authorization: `Bearer ${localStorage.getItem('sessionToken')}`
},
})
.then(response => {
console.log('success');
})
.catch(error => {
alert(error)
})
const socket = openSocket('http://localhost:3000')
socket.on('newuser', data => {
if (data.serverResponse === 'created') {
this.users = data.user
commit('GET_USERS', users)
})
})
你的 .catch 部分有问题,因为它在 .then 部分内,我还将你的套接字代码移到了承诺之外。
推荐阅读
- docker - 启动超级账本业务网络时出错
- unity3d - 为什么移动设备上的后处理速度极慢?
- leaflet - 将标记居中在 div 的中心
- reactjs - 如何选择要复制的文本而不触发reactjs中的点击事件
- javascript - 确保下一个函数仅在对话框关闭后运行
- javascript - “退格”和“清除”功能在 JavaScript 计算器中不起作用
- mysql - 如何映射 JPA 实体标识符以在 Oracle 和 MySQL 上工作
- python - 如何在python上注释空列表
- firebase - VueJS this.$firebase.storage 不是函数
- java - 如何在 Kuberetes 的容器中将应用程序配置与 AP 分开?