Socket.io - 终端返回数据为 "null"
Socket.io - Terminal returning data as "null"
我正在使用 reactjs、nodejs、express 和 mongoDB 构建一个论坛应用程序,用户可以在其中创建帐户、登录,然后 post 一个 post 文本。我希望这个 post 立即显示给所有其他用户,因为我正在使用 socket.io 服务器。
如果您在 github 中检查我的整个项目,我将不胜感激:(https://github.com/darkpsinight/forum)
但是,每当用户登录或连接到应用程序时,我都会在套接字终端中得到此 null:
Connected user.✅
null
我试图调查此 null 消息,我发现 data 正在返回 null。
如何使 createdPostsocket 的数据 returns 数据代替 null ?
编辑:
createdPostsocket初始化为null,而我的catch语句returnsnull,所以要么我是 没有给 createdPostsocket 赋值 或者我在我的承诺中抛出了一个错误。
与此同时,我已经在已完成的案例中为 Slice 分配了一个值:
[createPost.fulfilled]: (state, action) => {
console.log(action.payload);
window.location.reload(false);
state.createdPostsocket= action.payload.data.data
}
也就是说createdPostsocket赋值为payload.data.data,对吧?
我的代码:
- 返回:
app.js(套接字服务器)
const io = require("socket.io")(4000, {
cors: {
origin: "http://localhost:3000",
},
});
io.on('connection', (socket) => {
console.log('Connected user.✅');
socket.on('addPost', data => {
console.log(data); //returning null in terminal
io.emit('newPost', data)
})
socket.on('disconnect', function (socket) {
console.log('Disconnected user.⛔️');
});
});
- 前面:
postsSlice.js:
const initialState = {
posts: [],
createdPostsocket: null
};
const postsSlice = createSlice({
name: "posts",
initialState,
reducers: {},
extraReducers: {
//Create http request 3 cases
[createPost.pending]: (state, action) => {
},
[createPost.fulfilled]: (state, action) => {
console.log(action.payload);
window.location.reload(false);
state.createdPostsocket= action.payload.data.data
},
[createPost.rejected]: (state, action) => {
},
},
});
export const { } = postsSlice.actions;
export const selectPosts = (state) => state.posts
export default postsSlice.reducer;
index.jsx:
const posts = useSelector(selectPosts)
const socket = useRef()
useEffect(() => {
socket.current = io("ws://localhost:4000")
}, [])
useEffect(() => {
socket.current.emit("addPost", posts.createdPostsocket);
console.log (posts.createdPostsocket) //returning null in console developper
}, [posts.createdPostsocket])
postsAPI.js
import { axiosInstance } from "../../config/axios";
import { requests } from "../../config/requests";
//post service
export const PostsService = {
// Create post request
create: (data) => {
console.log(data);
return axiosInstance
.post(requests.postapi.create, data, { credentials: "include" })
.then((res) => {
return res;
})
.catch((err) => {
return err;
});
},
};
- 返回:
controller.js:
module.exports = {
create: (req, res) => {
const data = {
user: req.user.sub,
text: req.body.text,
/* image: req.file && req.file.filename */
}
console.log(data) //returning user and text
const t = new post(data)
t.save().then(t => t
.populate('user')
.then(post => {
res.status(200).json({
message: 'post created',
data: post
})
})
.catch(err => {
res.status(500).json({
message: 'post not created',
data: null
})
})
)
},
}
删除 window.location.reload(false);
这样您就不会丢失数据。 window.location.reload(false);
将重新加载您的页面并删除所有数据。但是不建议使用 vanilla JavaScript 调用 reload 方法来告诉浏览器重新加载当前页面,你会丢失任何数据。
我正在使用 reactjs、nodejs、express 和 mongoDB 构建一个论坛应用程序,用户可以在其中创建帐户、登录,然后 post 一个 post 文本。我希望这个 post 立即显示给所有其他用户,因为我正在使用 socket.io 服务器。
如果您在 github 中检查我的整个项目,我将不胜感激:(https://github.com/darkpsinight/forum)
但是,每当用户登录或连接到应用程序时,我都会在套接字终端中得到此 null:
Connected user.✅
null
我试图调查此 null 消息,我发现 data 正在返回 null。
如何使 createdPostsocket 的数据 returns 数据代替 null ?
编辑:
createdPostsocket初始化为null,而我的catch语句returnsnull,所以要么我是 没有给 createdPostsocket 赋值 或者我在我的承诺中抛出了一个错误。
与此同时,我已经在已完成的案例中为 Slice 分配了一个值:
[createPost.fulfilled]: (state, action) => {
console.log(action.payload);
window.location.reload(false);
state.createdPostsocket= action.payload.data.data
}
也就是说createdPostsocket赋值为payload.data.data,对吧?
我的代码:
- 返回:
app.js(套接字服务器)
const io = require("socket.io")(4000, {
cors: {
origin: "http://localhost:3000",
},
});
io.on('connection', (socket) => {
console.log('Connected user.✅');
socket.on('addPost', data => {
console.log(data); //returning null in terminal
io.emit('newPost', data)
})
socket.on('disconnect', function (socket) {
console.log('Disconnected user.⛔️');
});
});
- 前面:
postsSlice.js:
const initialState = {
posts: [],
createdPostsocket: null
};
const postsSlice = createSlice({
name: "posts",
initialState,
reducers: {},
extraReducers: {
//Create http request 3 cases
[createPost.pending]: (state, action) => {
},
[createPost.fulfilled]: (state, action) => {
console.log(action.payload);
window.location.reload(false);
state.createdPostsocket= action.payload.data.data
},
[createPost.rejected]: (state, action) => {
},
},
});
export const { } = postsSlice.actions;
export const selectPosts = (state) => state.posts
export default postsSlice.reducer;
index.jsx:
const posts = useSelector(selectPosts)
const socket = useRef()
useEffect(() => {
socket.current = io("ws://localhost:4000")
}, [])
useEffect(() => {
socket.current.emit("addPost", posts.createdPostsocket);
console.log (posts.createdPostsocket) //returning null in console developper
}, [posts.createdPostsocket])
postsAPI.js
import { axiosInstance } from "../../config/axios";
import { requests } from "../../config/requests";
//post service
export const PostsService = {
// Create post request
create: (data) => {
console.log(data);
return axiosInstance
.post(requests.postapi.create, data, { credentials: "include" })
.then((res) => {
return res;
})
.catch((err) => {
return err;
});
},
};
- 返回:
controller.js:
module.exports = {
create: (req, res) => {
const data = {
user: req.user.sub,
text: req.body.text,
/* image: req.file && req.file.filename */
}
console.log(data) //returning user and text
const t = new post(data)
t.save().then(t => t
.populate('user')
.then(post => {
res.status(200).json({
message: 'post created',
data: post
})
})
.catch(err => {
res.status(500).json({
message: 'post not created',
data: null
})
})
)
},
}
删除 window.location.reload(false);
这样您就不会丢失数据。 window.location.reload(false);
将重新加载您的页面并删除所有数据。但是不建议使用 vanilla JavaScript 调用 reload 方法来告诉浏览器重新加载当前页面,你会丢失任何数据。